2010-02-24 24 views
27

Aquí está el escenario. En su función, está ejecutando declaraciones usando un cursor, pero una de ellas falla y se lanza una excepción. Su programa sale de la función antes de cerrar el cursor con el que estaba trabajando. ¿Flotará el cursor ocupando espacio? ¿Debo cerrar el cursor?En Python con sqlite ¿es necesario cerrar un cursor?

Además, la documentación de Python tiene un ejemplo de uso del cursor y dice: "También podemos cerrar el cursor si hemos terminado con él". La palabra clave es "puede", no "debe". ¿Qué significan precisamente con esto?

Respuesta

7

No está obligado a llamar al close() en el cursor; puede ser basura recogida como cualquier otro objeto.

Pero incluso si está esperando a que la recolección de elementos no utilizados suene bien, creo que sería un buen estilo aún garantizar que un recurso como un cursor de base de datos se cierre si hay una excepción o no.

15

Probablemente sea una buena idea (aunque puede no importar mucho con sqlite, no lo sé, pero hará que su código sea más portátil). Además, con la reciente Python (2.5+), es fácil:

from __future__ import with_statement 
from contextlib import closing 

with closing(db.cursor()) as cursor: 
    # do some stuff 
5

No he visto ningún efecto para la operación sqlite3.Cursor.close() todavía.

Después del cierre, aún puede llamar al fetch(all|one|many), que devolverá los resultados restantes de la instrucción de ejecución anterior. Incluso corriendo Cursor.execute() todavía funciona ...

+1

me di cuenta el mismo comportamiento (que tenía una prueba escrita para asegurarse de que el cursor se cierra, y falló), y se preguntan si se trata de un problema de conector de pitón o algo inherente a sqlite3. – haridsv

1

Curiosamente, el Python 3.0 doc dice "También podemos cerrar el cursor si hemos terminado con él", mientras que el doc Python 2.7 y 3.6 dice "También podemos cerrar la conexiónsi se hace con eso ".

Los documentos Python 2.7 y 3.0-3.4 no describen el método del cursor .close(). Pero el Python 3.5 y 3.6 documentos describen el método cursor .close():

Cerrar el cursor ahora (en lugar de cada vez que se llama __del__).

El cursor no se podrá usar a partir de ahora; Se generará una excepción ProgrammingError si se intenta alguna operación con el cursor.

0

Este código cerrará automáticamente el Cursor. También se cerrará automáticamente y enviará el Connection.

import sqlite3 
import contextlib 

def execute_statement(statement): 
    with contextlib.closing(sqlite3.connect(path_to_file)) as conn: # auto-closes 
     with conn: # auto-commits 
      with contextlib.closing(conn.cursor()) as cursor: # auto-closes 
       cursor.execute(statement) 
Cuestiones relacionadas