2013-05-02 5 views
9

Ошибка OperationalError: (OperationalError) (2006, 'MySQL server has gone away') Я уже получил эту ошибку, когда я закодировал проект на Flask, но я не могу понять, почему я получаю эту ошибку.Ошибка SQLAlchemy Сервер MySQL ушел

У меня есть код (да, если код малые и исполняющие быстро, то никаких ошибки), как этот \

db_engine = create_engine('mysql://[email protected]/mind?charset=utf8', pool_size=10, pool_recycle=7200) 
Base.metadata.create_all(db_engine) 

Session = sessionmaker(bind=db_engine, autoflush=True) 
Session = scoped_session(Session) 
session = Session() 

# there many classes and functions 

session.close() 

И этот код возвращает меня ошибка 'MySQL server has gone away', но вернуть его через некоторое время, когда я использую паузы в моем сценарии.

Mysql я использую с openserver.ru (это веб-сервер, такой как wamp).

Спасибо ..

+2

Документация для [сервера MySQL ушла] (https://dev.mysql.com/doc/refman/5.0/en/gone-away.html). – timss

+0

Я думаю, что я получаю эту ошибку, потому что у меня есть логическая ошибка в моем скрипте ... –

+0

Я думаю, что вам нужно заново создать движок или сессионное устройство, когда это произойдет, но я все еще расследую. – Milimetric

ответ

12

SQLAlchemy теперь имеет большую рецензию о том, как вы можете использовать пинг пессимистичны о свежести вашего соединения в:

http://docs.sqlalchemy.org/en/latest/core/pooling.html#disconnect-handling-pessimistic

Оттуда

from sqlalchemy import exc 
from sqlalchemy import event 
from sqlalchemy.pool import Pool 

@event.listens_for(Pool, "checkout") 
def ping_connection(dbapi_connection, connection_record, connection_proxy): 
    cursor = dbapi_connection.cursor() 
    try: 
     cursor.execute("SELECT 1") 
    except: 
     # optional - dispose the whole pool 
     # instead of invalidating one at a time 
     # connection_proxy._pool.dispose() 

     # raise DisconnectionError - pool will try 
     # connecting again up to three times before raising. 
     raise exc.DisconnectionError() 
    cursor.close() 

И испытание, чтобы удостовериться, что вышеуказанные работы:

from sqlalchemy import create_engine 
e = create_engine("mysql://scott:[email protected]/test", echo_pool=True) 
c1 = e.connect() 
c2 = e.connect() 
c3 = e.connect() 
c1.close() 
c2.close() 
c3.close() 

# pool size is now three. 

print "Restart the server" 
raw_input() 

for i in xrange(10): 
    c = e.connect() 
    print c.execute("select 1").fetchall() 
    c.close() 
+0

Ты потрясающий, спасибо! – Will

+3

Мне очень не нравятся люди без голосования без комментариев. SO должен действительно требовать комментариев от пустых голосов ... – Milimetric

0

от documentation вы можете использовать pool_recycle параметр:

from sqlalchemy import create_engine 
e = create_engine("mysql://scott:[email protected]/test", pool_recycle=3600) 
+0

[OP] (https://stackoverflow.com/q/16341911/110488) уже использует этот параметр. –

0

Я просто столкнулась с той же проблемой, которая решается с некоторым усилием. Пожелайте, чтобы мой опыт был полезным для других.

Попав некоторые предложения, я использовал пул соединений и установил pool_recycle менее wait_timeout, но он все еще не работает.

Тогда я понял, что глобальная сессия, возможно, просто использует то же соединение, и пул соединений не работает. Чтобы избежать глобальной сессии, для каждого запроса создается новый сеанс, который после обработки удаляется Session.remove().

И, наконец, все в порядке.

Смежные вопросы