2010-09-23 79 views
24

Usando el siguiente código me deja con una conexión abierta, ¿cómo cierro?Conexión a la base de datos de Python Cerrar

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 

Respuesta

26

conexiones tienen un método close como se especifica en el PEP-249 (Base de datos de Python API especificación 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

es posible que trate de apagar la puesta en común, que está activada de forma predeterminada. Consulte this discusión para obtener más información.

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

divertido que podía utilizar la puesta en común, pero MySQL simplemente comienza otra conn con una nueva identificación. – Merlin

39

se puede envolver toda la conexión en un gestor de contexto, como la siguiente:

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

luego hacer algo como esto que cada vez que necesita una conexión de base de datos:

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

El la conexión se cerrará cuando salga del bloque con. Esto también revertirá la transacción si ocurre una excepción o si no abrió el bloque usando with open_db_connection("...", commit=True).

+0

buena idea, pero yo uso Mysql y Sqlite .... no oráculo (bueno, no directamente :-)!) Donde la cadena de conexión con el controlador ... ¿por qué importar el sistema? – Merlin

+0

Vaya, pensé que reemplacé mi código específico de Oracle con pyodbc, pero pasé por alto uno (corregido ahora). La sintaxis es la misma, ya que ambas usan la API común de base de datos PEP 249. Importé el sistema para poder escribir cualquier excepción al error estándar. También puede usar el registro o simplemente una declaración de impresión simple. Y pasa la misma cadena de conexión que estaba utilizando antes a open_db_connection(). – AndrewF

+0

Ok, mirando el código: ¿Qué obtengo al hacer? Parece que hay muchas líneas adicionales de código para verificar si la conexión está abierta. – Merlin

1

Según la documentación de pyodbc, conexiones al servidor SQL are not closed by default. Algunos controladores de bases de datos no cierran las conexiones cuando se invoca close() para guardar viajes de ida y vuelta al servidor.

Para terminar la conexión cuando se llama close() se debe configurar la agrupación en Falso:

import pyodbc 

pyodbc.pooling = False 
Cuestiones relacionadas