2015-01-09 12 views
5

Kayıtlı kullanıcılar bazında birkaç veri kaynağını birleştiren bir proje üzerinde çalışıyorum. Özellikle bir sorgu sorunların beni çok veriyor: Sqlalchemy, sorgu sırasında bağlantıyı kaybediyor

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) 

olursa olsun ne denedim, bu hatayı alıyorum (üç saniye içinde hemen hemen her zaman, bazen anında).

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

ben de çalıştı ama aynı hatayı alıyorum burada dokümanlar başına create_engine fonksiyonu http://docs.sqlalchemy.org/en/latest/core/engines.html

-pool_timeout ve pool_recycle seçenekleri eklemek gibi bir kaç şey denedim.

İlginç olan şey, bu sorguyu Sequel Pro'da çalıştırdığımda iyi çalışıyor; Satırları hemen döndürmeye başlar ve sadece bitirmek için ~ 10 saniye sürer. Çıktı yaklaşık 550.000 satırdır.

Orada bulduğum diğer ipler/mesajların sayısı vardır, ama hiçbiri oldukça neye ihtiyacım ele görünüyor:

: 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

burada http://dev.mysql.com/doc/refman/5.5/en/error-lost-connection.html docs okuma, ben bu çizgiyi fark

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.

Bu seçeneği değiştirmem gerekebilir gibi görünüyor, ancak SQLAlchemy belgelerinde buna değinen hiçbir şey bulamıyorum.

Daha önce bu soruna giren var mı? Eğer öyleyse, bunu nasıl düzelttiniz?

+0

Bu sorgu farklı bir yöntem (ör., Bir GUI sql yöneticisi) kullanırken işe yarar mı? Mysqlconnector'dan farklı bir DBAPI denediniz mi (örneğin 'pymysql', seçenekleriniz için [buradan] (http://docs.sqlalchemy.org/en/rel_0_9/dialects/mysql.html#dialect-mysql) kontrol ediniz. ? – ari

+0

Evet, Sequel Pro http://www.sequelpro.com ile iyi çalışıyor. Yine de mymysql denemedim. – measureallthethings

+0

Başka bir DBAPI ile deneyin: pymysql için terminalde (ya da Anaconda yoksa pip) 'conda install pymysql' komutunu çalıştırarak ve' create_engine' dizginizdeki 'mysqlconnector'' pymysql' ile değiştirerek indirebilirsiniz. . – ari

cevap

0

MySQL sunucunuzun max_allowed_packet_size değişkenini kontrol edin ve artırın. MySQL'in bir sorgulama sırasında bağlantıyı bıraktığı zaman çoğu zaman yükün çok büyük olmasıydı.