2015-04-25 20 views
6

Come si impedisce l'errore "ProgrammingError: execute cannot be used while an asynchronous query is underway"? Dai documenti dice che dovrei usare psycopg2.extras.wait_select se sto usando un supporto di coroutine come gevent., Ma sto ancora ricevendo quell'errore quando lo sto usando. Ho isolato l'errore che sto ricevendo nello snippet qui sotto.Errore Python: esecuzione non può essere utilizzata mentre è in corso una query asincrona

con = psycopg2.connect(database=DATABASE_NAME, user=DATABASE_USERNAME) 

def execute_query(cur, query, params): 
    psycopg2.extras.wait_select(con) 
    cur.execute(query, params) 
    psycopg2.extras.wait_select(con) 
    rows = cur.fetchall() 
    print rows[0] 

cur = con.cursor() 
query = "SELECT * FROM mytable" 
gevent.joinall([ 
    gevent.spawn(execute_query, cur, query, None), 
    gevent.spawn(execute_query, cur, query, None), 
    gevent.spawn(execute_query, cur, query, None), 
    gevent.spawn(execute_query, cur, query, None) 
]) 

risposta

6

Si sta tentando di eseguire più di una transazione contemporaneamente su una singola connessione. La documentazione di psycopg dice che questo non è thread-safe e porterà a un errore. Vedi sotto Asynchronous support and Support for coroutine libraries

Una possibile soluzione è utilizzare una connessione al database, ciascuna con un cursore, per coroutine (4 connessioni distinte e cursori in questo caso).

+0

Così ho provato il tuo suggerimento e ho creato il cursore nel metodo 'execute_query' e ho ancora lo stesso errore. – User134

+0

hai provato una connessione come nell'esempio di codice o quattro connessioni/cursori (uno per coroutine)? – paisanco

+0

Oh. Errore mio. Con quattro connessioni, l'errore scompare. Ma mi chiedo dell'efficienza dell'uso di una nuova connessione ogni volta che voglio fare una singola query. – User134