2010-09-23 8 views
24

En utilisant le code ci-dessous me laisse une connexion ouverte, comment puis-je fermer?Python Connexion à une base de données Fermer

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 

Répondre

26

connexions ont une méthode close tel que spécifié dans le PEP-249 (API Python Database spécification 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

Vous pouvez essayer de désactiver la mise en commun, qui est activé par défaut. Voir this discussion pour plus d'informations.

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

drôle je pouvais utiliser la mise en commun, mais MySQL démarre juste un autre conn avec un nouvel ID. – Merlin

39

Vous pouvez envelopper toute la connexion dans un gestionnaire de contexte, comme ce qui suit:

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

faire quelque chose comme celui-ci où jamais vous avez besoin d'une connexion de base de données:

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

Le la connexion se ferme lorsque vous quittez le bloc avec. Cela annulera également la transaction si une exception se produit ou si vous n'avez pas ouvert le bloc à l'aide de with open_db_connection("...", commit=True).

+0

bonne idée, mais j'utilise Mysql et Sqlite .... pas oracle (bien pas directement :-)!) Où la chaîne de connexion au pilote ... pourquoi importer sys? – Merlin

+0

Oups, je pensais avoir remplacé mon code oracle par pyodbc, mais j'en ai oublié un (corrigé maintenant). La syntaxe est la même, puisque les deux utilisent l'API de base de données commune PEP 249. J'ai importé le système afin que je puisse écrire des exceptions à l'erreur standard. Vous pouvez également utiliser la journalisation ou simplement une déclaration en clair. Et vous passez la même chaîne de connexion que vous utilisiez auparavant à open_db_connection(). – AndrewF

+0

Ok, en regardant le code: Qu'est-ce que je reçois en faisant? On dirait qu'il y a beaucoup de lignes de code supplémentaires pour vérifier si la connexion est ouverte? – Merlin

1

Selon la documentation de pyodbc, les connexions au serveur SQL are not closed by default. Certains pilotes de base de données ne ferment pas les connexions lorsque close() est appelé afin d'économiser les allers-retours au serveur.

Pour fermer la connexion lorsque vous appelez close() vous devez définir la mise en commun False:

import pyodbc 

pyodbc.pooling = False