2010-02-24 16 views
27

Ecco lo scenario. Nella tua funzione stai eseguendo delle istruzioni usando un cursore, ma una di esse fallisce e viene lanciata un'eccezione. Il tuo programma esce dalla funzione prima di chiudere il cursore su cui stava lavorando. Il cursore fluttuerà intorno occupando spazio? Devo chiudere il cursore?In Python con sqlite è necessario chiudere un cursore?

Inoltre, la documentazione di Python ha un esempio di utilizzo del cursore e dice: "Possiamo anche chiudere il cursore se abbiamo finito con esso." La parola chiave "può", non "deve". Cosa significano esattamente da questo?

risposta

7

Non sei obbligato a chiamare close() sul cursore; può essere raccolto come qualsiasi altro oggetto.

Ma anche se l'attesa per la raccolta di dati inutili sembra corretta, penso che sarebbe comunque opportuno assicurarsi che una risorsa come un cursore del database venga chiusa indipendentemente dall'eccezione.

15

Probabilmente è una buona idea (anche se potrebbe non essere molto importante con sqlite, non lo so, ma renderà il tuo codice più portabile). Inoltre, con la recente Python (2.5+), è facile:

from __future__ import with_statement 
from contextlib import closing 

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

non ho ancora visto alcun effetto per l'operazione sqlite3.Cursor.close().

Dopo la chiusura, è comunque possibile chiamare fetch(all|one|many) che restituirà i risultati rimanenti dall'istruzione di esecuzione precedente. Anche in esecuzione Cursor.execute() funziona ancora ...

+1

ho notato lo stesso comportamento (ho avuto una prova scritta per assicurarsi che il cursore è chiuso, ed è fallito), e mi chiedo se si tratta di un problema di connettore di pitone o qualcosa inerente con sqlite3. – haridsv

1

interessante notare che il Python 3.0 doc dice "Possiamo anche chiudere il cursore se abbiamo finito con essa", mentre il doc Python 2.7 e 3.6 dice: "Possiamo anche chiudere la collegamento se noi sono fatti con esso ".

I documenti Python 2.7 e 3.0-3.4 non descrivono il metodo del cursore .close(). Ma il pitone 3.5 e 3.6 documenti descrivono il metodo cursor .close():

chiudere il cursore ora (anziché ogni volta __del__ è chiamato).

Il cursore sarà inutilizzabile da questo punto in poi; un'eccezione ProgrammingError verrà sollevata se viene tentata qualsiasi operazione con il cursore.

0

Questo codice chiude automaticamente lo Cursor. Inoltre, chiuderà e commetterà automaticamente lo 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) 
Problemi correlati