2015-01-09 17 views
5

登録ユーザーをベースにしたいくつかのデータソースを組み合わせたプロジェクトに取り組んでいます。特に、一つのクエリは私に多くの問題を与えている:クエリ中にSqlalchemyの接続が失われる

import numpy as np 
import pandas as pd 
from pandas import Series, DataFrame 
from sqlalchemy import create_engine 

# of course, the info here is obscured 
prod_engine = create_engine('mysql+mysqlconnector://[email protected]:3306/database',pool_timeout=3600,pool_recycle=3600) 

query_users = """ 
SELECT users.id, 
CASE 
    WHEN ((users.role = '' OR users.role IS NULL) AND users.plan LIKE 'pro%') OR users.role REGEXP '(pro|agent|manager)' THEN 'professional' ELSE 'consumer' 
END AS 'modified_role', 
users.created_at, 
users.logged_in_at AS 'last_login', 
COUNT(DISTINCT(folders.id)) AS 'folder_count', 
IF(COUNT(DISTINCT(folders.id)) > 1, '2 or more','0 to 1') AS 'folder_group', 
MIN(folders.created_at) AS 'first_folder_created', 
MAX(folders.created_at) AS 'last_folder_created' 
FROM users 
LEFT OUTER JOIN folders 
ON folders.created_by = users.id 
AND folders.discarded = 0 
AND folders.created_at >= '2010-11-30 23:59:59' 
WHERE users.invalid_email IS NULL 
GROUP BY 1""" 

users = pd.read_sql_query(query_users, prod_engine) 

は、どんなに私が試したものを、私は(時には瞬時に、ほとんど常に3秒以内)に、このエラーを取得していません。

InterfaceError: (InterfaceError) 2013: Lost connection to MySQL server during query 

は、私はまたを試してみましたが、同じエラーを取得し、ここでのドキュメントあたりcreate_engine機能http://docs.sqlalchemy.org/en/latest/core/engines.html

pool_timeoutpool_recycleオプションの追加など、いくつかのことを試してみました。

興味深いことに、このクエリはSequel Proで実行するたびに正常に動作します。それはすぐに行を返すようになり、完全に完了するまで10秒かかります。出力は約550,000行です。

があり、私が見つけた他のスレッド/投稿数がありますが、どれも非常に私は必要なものを扱うように思わない:

https://groups.google.com/forum/#!topic/sqlalchemy/TWL7aWab9ww Handle SQLAlchemy disconnect http://blog.fizyk.net.pl/blog/reminder-set-pool_recycle-for-sqlalchemys-connection-to-mysql.html

がここhttp://dev.mysql.com/doc/refman/5.5/en/error-lost-connection.htmlドキュメントを読んで、私はこのラインに気づきました

Sometimes the “during query” form happens when millions of rows are being sent as part of one or more queries. If you know that this is happening, you should try increasing net_read_timeout from its default of 30 seconds to 60 seconds or longer, sufficient for the data transfer to complete.

私はこのオプションを変更する必要があるようですが、これについて言及しているSQLAlchemyのドキュメントでは何も見つかりません。

誰もこの問題に遭遇しましたか?もしそうなら、それをどうやって修正しましたか?

+0

別の方法(GUIのSQLマネージャなど)を使用している場合、そのクエリは機能しますか?あなたは 'mysqlconnector'以外の別のDBAPIを試しましたか(例えば' pymysql'、あなたのオプションについては[here](http://docs.sqlalchemy.org/en/rel_0_9/dialects/mysql.html#dialect-mysql)をチェックしてください) ? – ari

+0

はい、Sequel Pro http://www.sequelpro.comでうまくいきます。しかし、mymysqlを試していない。 – measureallthethings

+0

別のDBAPIを試してみてください:pymysqlの場合は、ターミナルに 'conda install pymysql'を実行してダウンロードしてください。(もしあなたがAnacondaを持っていなければpipしてください)' create_engine'文字列で 'mysqlconnector'を' pymysql' 。 – ari

答えて

0

MySQLサーバのmax_allowed_packet_size変数を確認して、それを増やしてください。クエリの実行中にMySQLが接続を切断するときは、ペイロードが大きすぎるためです。

関連する問題