2015-01-09 38 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) 

不管是什麼我已經試過,我得到這個錯誤(幾乎總是在三秒鐘內,有時瞬間)。

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

我已經嘗試了一些東西,比如添加pool_timeoutpool_recycle選項每文檔的create_engine功能這裏http://docs.sqlalchemy.org/en/latest/core/engines.html

我也試過,但得到了同樣的錯誤。

有趣的是,只要我在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',你可以在這裏檢查[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'字符串中用'pymysql'替換'mysqlconnector' 。 – ari

回答

0

檢查你的MySQL服務器的變量max_allowed_packet_size並增加它。大多數情況下,當MySQL在查詢過程中斷開連接時,這是因爲有效負載太大。

相關問題