2010-09-23 1 views
24

L'utilizzo del codice seguente mi lascia con una connessione aperta, come posso chiudere?Connessione al database Python Chiudi

import pyodbc 
conn = pyodbc.connect('DRIVER=MySQL ODBC 5.1 driver;SERVER=localhost;DATABASE=spt;UID=who;PWD=testest') 

csr = conn.cursor() 
csr.close() 
del csr 

risposta

26

connessioni hanno un metodo close come specificato nel PEP-249 (Python Database API Specification v2.0):

import pyodbc 
conn = pyodbc.connect('DRIVER=MySQL ODBC 5.1 driver;SERVER=localhost;DATABASE=spt;UID=who;PWD=testest') 

csr = conn.cursor() 
csr.close() 
del csr 
conn.close()  #<--- Close the connection 
6

si potrebbe provare a spegnere il pool, che è abilitato di default. Vedere la discussione this per ulteriori informazioni.

import pyodbc 
pyodbc.pooling = False 
conn = pyodbc.connect('DRIVER=MySQL ODBC 5.1 driver;SERVER=localhost;DATABASE=spt;UID=who;PWD=testest') 

csr = conn.cursor() 
csr.close() 
del csr 
+0

divertente ho potuto usare la messa in comune, ma mysql appena inizia un'altra conn con un nuovo ID. – Merlin

39

si può avvolgere l'intera connessione in un contesto responsabile, come il seguente:

from contextlib import contextmanager 
import pyodbc 
import sys 

@contextmanager 
def open_db_connection(connection_string, commit=False): 
    connection = pyodbc.connect(connection_string) 
    cursor = connection.cursor() 
    try: 
     yield cursor 
    except pyodbc.DatabaseError as err: 
     error, = err.args 
     sys.stderr.write(error.message) 
     cursor.execute("ROLLBACK") 
     raise err 
    else: 
     if commit: 
      cursor.execute("COMMIT") 
     else: 
      cursor.execute("ROLLBACK") 
    finally: 
     connection.close() 

poi fare qualcosa come questo, dove mai è necessario una connessione al database:

with open_db_connection("...") as cursor: 
    # Your code here 

Il la connessione si chiuderà quando si lascia il blocco con. In questo modo si ripristinerà anche la transazione se si verifica un'eccezione o se non si è aperto il blocco utilizzando with open_db_connection("...", commit=True).

+0

buona idea, ma io uso Mysql e Sqlite .... non oracle (beh non direttamente :-)!) Dove la stringa di connessione al driver ... perché importa sys? – Merlin

+0

Whoops, pensavo di aver sostituito il mio codice specifico per Oracle con pyodbc, ma ne ho ignorato uno (risolto ora). La sintassi è la stessa, poiché entrambi utilizzano l'API di database PEP 249 comune. Ho importato sys in modo da poter scrivere eventuali eccezioni all'errore standard. È anche possibile utilizzare la registrazione o solo una semplice istruzione di stampa. E tu passi la stessa stringa di connessione che stavi usando prima di open_db_connection(). – AndrewF

+0

Ok, guardando il codice: cosa ottengo facendo? Sembra un sacco di righe aggiuntive di codice per verificare se la connessione è aperta? – Merlin

1

In base alla documentazione di pyodbc, connessioni al server SQL are not closed by default. Alcuni driver di database non chiudono le connessioni quando viene chiamato close() per salvare round-trip sul server.

di chiudere il collegamento quando si chiama close() è necessario impostare il pool False:

import pyodbc 

pyodbc.pooling = False