2009-12-30 16 views

risposta

10

Si potrebbe avvolgere in una dichiarazione try, except:

>>> conn = sqlite3.connect('mydb') 
>>> conn.close() 
>>> try: 
... resultset = conn.execute("SELECT 1 FROM my_table LIMIT 1;") 
... except sqlite3.ProgrammingError as e: 
... print e 
Cannot operate on a closed database. 

Questo si basa su un shortcut specific to sqlite3.

+7

Il metodo è sano, ma evita di fare un "SELECT * FROM mytable" mentre puoi fare un molto più leggero "SELECT one_column FROM mytable LIMIT 1'. Il primo è orribilmente inefficiente se hai un database non piccolo. –

+0

grazie a @pitrou, aggiornato per tenerne conto. – bernie

+3

@AntoineP. stai confondendo SQLite con altri database. Non c'è differenza nella quantità di lavoro svolto da SQLite. Non calcola tutti i risultati per una query in anticipo, ma fa la minima quantità di lavoro possibile per dare la prima riga del risultato. La seconda riga del risultato viene elaborata solo quando lo chiedi. Di conseguenza il limite non ha alcun effetto. In ogni caso, una query migliore è quella che non dipende dallo schema, ad es. PRAGMA user_version. –

0

Che ne dici di assicurarsi che la connessione e il cursore non siano mai chiusi?

Si può avere un programma basato sullo stato che è possibile garantire solo le chiamate close() al momento giusto.

Oppure avvolgerli in altri oggetti con un'implementazione di passaggio di close(). Oppure aggiungi un membro _isclosed impostato da close() e accessibile da isclosed().

Problemi correlati