2013-05-02 12 views
9

Errore OperationalError: (OperationalError) (2006, 'MySQL server has gone away') Ho già ricevuto questo errore quando ho programmato il progetto su Flask, ma non capisco perché ottengo questo errore.Errore SQLAlchemy Il server MySQL è andato via

Ho codice (sì, se il codice di piccole dimensioni e l'esecuzione veloce, poi nessun errore) come questo \

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() 

e questo codice mi restituisce l'errore 'MySQL server has gone away', ma restituirlo dopo qualche tempo, quando uso pause nella mia sceneggiatura

Mysql utilizzo da openserver.ru (è un server Web come wamp).

Thanks ..

+2

Documentazione per [Il server MySQL è andato via] (https://dev.mysql.com/doc/refman/5.0/en/gone-away.html). – timss

+0

Penso che ottengo questo errore perché ho un errore logico nel mio script ... –

+0

Penso che devi ricreare il motore o il sessionmaker quando questo accade, ma sto ancora indagando. – Milimetric

risposta

12

SQLAlchemy ha ora una grande write-up su come è possibile utilizzare facendo un rumore metallico di essere pessimisti circa la freschezza della tua connessione:

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

Da lì,

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() 

E un test per assicurarsi che quanto sopra funziona:

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

Sei fantastico, grazie! – Will

+3

Non mi piace molto il downgrade delle persone senza un commento. SO dovrebbe davvero richiedere un commento su voti bassi ... – Milimetric

0

da documentation è possibile utilizzare pool_recycle parametro:

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

Il [OP] (https://stackoverflow.com/q/16341911/110488) sta già utilizzando questo parametro. –

0

ho appena affrontato lo stesso problema, che viene risolto con un certo sforzo. Vorrei che la mia esperienza fosse d'aiuto agli altri.

Per alcuni suggerimenti, ho utilizzato il pool di connessioni e impostato pool_recycle inferiore a wait_timeout, ma non funziona ancora.

Quindi, ho realizzato che la sessione globale potrebbe semplicemente utilizzare la stessa connessione e il pool di connessioni non funzionava. Per evitare la sessione globale, per ogni richiesta generare una nuova sessione che viene rimossa da Session.remove() dopo l'elaborazione.

Infine, tutto va bene.

Problemi correlati