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ś?
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
Tak, działa dobrze z programem Sequel Pro http://www.sequelpro.com. Nie próbowałem jednak mymysql. – measureallthethings
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