登録ユーザーをベースにしたいくつかのデータソースを組み合わせたプロジェクトに取り組んでいます。特に、一つのクエリは私に多くの問題を与えている:クエリ中に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_timeout
とpool_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のドキュメントでは何も見つかりません。
誰もこの問題に遭遇しましたか?もしそうなら、それをどうやって修正しましたか?
別の方法(GUIのSQLマネージャなど)を使用している場合、そのクエリは機能しますか?あなたは 'mysqlconnector'以外の別のDBAPIを試しましたか(例えば' pymysql'、あなたのオプションについては[here](http://docs.sqlalchemy.org/en/rel_0_9/dialects/mysql.html#dialect-mysql)をチェックしてください) ? – ari
はい、Sequel Pro http://www.sequelpro.comでうまくいきます。しかし、mymysqlを試していない。 – measureallthethings
別のDBAPIを試してみてください:pymysqlの場合は、ターミナルに 'conda install pymysql'を実行してダウンロードしてください。(もしあなたがAnacondaを持っていなければpipしてください)' create_engine'文字列で 'mysqlconnector'を' pymysql' 。 – ari