2015-01-09 29 views
5

Pracuję nad projektem, który łączy kilka źródeł danych w oparciu o zarejestrowanych użytkowników. Jedno zapytanie w szczególności daje mi wiele problemów:Sqlalchemy traci połączenie podczas kwerendy

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) 

Bez względu na to, co próbowałem, mam ten błąd (prawie zawsze w ciągu trzech sekund, czasami od razu).

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

Próbowałem kilka rzeczy, takich jak dodanie opcji pool_timeout i pool_recycle do create_engine funkcji za docs tutaj http://docs.sqlalchemy.org/en/latest/core/engines.html

Próbowałem też ale uzyskać ten sam błąd.

Interesujące jest to, że zapytanie to działa poprawnie, gdy uruchomię go w Sequel Pro; natychmiast zaczyna zwracać wiersze i zajmuje tylko około 10 sekund, aby zakończyć całkowicie. Dane wyjściowe to około 550 000 wierszy.

Istnieje wiele innych wątków/postów znalazłem, ale nie wydaje się dość zająć czego potrzebuję: 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

Czytanie docs tutaj http://dev.mysql.com/doc/refman/5.5/en/error-lost-connection.html, zauważyłem tę linię:

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.

Wygląda na to, że potrzebuję zmienić tę opcję, ale nie mogę znaleźć niczego w dokumentach SQLAlchemy, które wspominają o tym.

Czy ktoś już wcześniej napotkał ten problem? Jeśli tak, jak to naprawiłeś?

+0

Czy to zapytanie działa przy użyciu innej metody (na przykład menedżera sql GUI)? Czy wypróbowałeś inny DBAPI niż 'mysqlconnector' (np.' Pymysql', sprawdź [tutaj] (http://docs.sqlalchemy.org/en/rel_0_9/dialects/mysql.html#dialect-mysql) dla twoich opcji) ? – ari

+0

Tak, działa dobrze z programem Sequel Pro http://www.sequelpro.com. Nie próbowałem jednak mymysql. – measureallthethings

+0

Spróbuj z innym DBAPI: dla pymysql możesz go pobrać uruchamiając 'conda install pymysql' na terminalu (lub pip, jeśli nie masz Anacondy), a następnie po prostu zastępując' mysqlconnector' 'pymysql' w ciągu' create_engine' . – ari

Odpowiedz

0

Sprawdź zmienną serwera MySQL o wartości max_allowed_packet_size i zwiększ ją. Przez większość czasu, gdy MySQL zrywa połączenie podczas zapytania, dzieje się tak, ponieważ ładunek jest za duży.

Powiązane problemy