2009-12-30 22 views

Respuesta

10

Usted puede envolver en un comunicado 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. 

Esto se basa en un shortcut specific to sqlite3.

+7

El método es sensato, pero evite hacer un 'SELECT * FROM mytable' mientras que usted puede hacer mucho más ligero' SELECT one_column FROM mytable LIMIT 1'. El primero es terriblemente ineficiente si tiene una base de datos no pequeña. –

+0

gracias @pitrou, actualizado para tomar eso en consideración. – bernie

+3

@AntoineP. está confundiendo SQLite con otras bases de datos. No hay diferencia en la cantidad de trabajo realizado por SQLite. No calcula todos los resultados para una consulta por adelantado, sino que realiza la menor cantidad de trabajo posible para dar la primera fila de resultados. La segunda fila de resultados solo se resuelve cuando la solicite. En consecuencia, el límite no tiene ningún efecto. En cualquier caso, una consulta mejor es aquella que no depende del esquema, por ejemplo, PRAGMA user_version. –

0

¿Qué hay de asegurarse de que la conexión y el cursor nunca estén cerrados?

Puede tener un programa basado en estado que pueda garantizar que solo las llamadas se cierren() en el momento correcto.

O envuélvalos en otros objetos que tengan una implementación de pase de close(). O agregue un conjunto de miembros _isclosed por close() y acceda al isclosed().

Cuestiones relacionadas