2010-09-23 8 views
24

Mit dem folgenden Code hinterlässt mich eine offene Verbindung, wie schließe ich?Python-Datenbankverbindung Schließen

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 

Antwort

26

Verbindungen haben ein close Verfahren nach PEP-249 (Python Database API Specification v2.0) angegeben:

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

Sie könnten versuchen, Pooling ausschalten, die standardmäßig aktiviert ist. Weitere Informationen finden Sie unter this Diskussion.

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

Lustig die Zusammenlegung verwende ich konnte, aber mysql startet gerade ein anderes Anschl. – Merlin

39

Sie können die gesamte Verbindung in einem Kontext-Manager wickeln, wie folgt aus:

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

Dann etwas tun, wo immer Sie eine Datenbankverbindung benötigen:

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

Die Die Verbindung wird geschlossen, wenn Sie den with-Block verlassen. Dies wird auch die Transaktion Rollback, wenn eine Ausnahme auftritt oder wenn Sie den Block nicht mit with open_db_connection("...", commit=True) öffnen.

+0

gute Idee, aber ich benutze Mysql und Sqlite .... nicht Orakel (naja nicht direkt :-)!) Wo die Verbindungszeichenfolge zum Treiber ... warum importieren sys? – Merlin

+0

Whoops, ich dachte, ich hätte meinen orakelspezifischen Code durch pyodbc ersetzt, aber ich habe einen übersehen (jetzt behoben). Die Syntax ist die gleiche, da beide die gemeinsame API-API PEP 249 verwenden. Ich habe sys importiert, damit ich Ausnahmen vom Standardfehler schreiben konnte. Sie könnten auch Protokollierung oder nur eine einfache Druckanweisung verwenden. Und Sie übergeben die gleiche Verbindungszeichenfolge, die Sie zuvor verwendet haben, an open_db_connection(). – AndrewF

+0

Ok, mit Blick auf den Code: Was bekomme ich dabei? Scheint wie eine Menge zusätzlicher Codezeilen, um zu prüfen, ob die Verbindung offen ist. – Merlin

1

Nach pyodbc-Dokumentation Verbindungen zum SQL-Server are not closed by default. Einige Datenbanktreiber schließen keine Verbindungen, wenn close() aufgerufen wird, um Roundtrips auf dem Server zu speichern.

Ihre Verbindung schließen, wenn Sie close() rufen Sie auf False Pooling setzen soll

mit einer neuen ID
import pyodbc 

pyodbc.pooling = False 
Verwandte Themen