2009-12-30 3 views

Répondre

10

Vous pouvez envelopper dans une déclaration 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. 

Cela repose sur un shortcut specific to sqlite3.

+7

La méthode est saine, mais évitez de faire 'SELECT * FROM mytable' alors que vous pouvez faire beaucoup plus léger' SELECT one_column FROM mytable LIMIT 1'. Le premier est horriblement inefficace si vous avez une base de données non-petite. –

+0

merci @pitrou, mis à jour pour en tenir compte. – bernie

+3

@AntoineP. vous confondez SQLite avec d'autres bases de données. Il n'y a pas de différence dans la quantité de travail effectué par SQLite. Il ne calcule pas tous les résultats d'une requête à l'avance - à la place, il fait le moins de travail possible pour donner la première ligne de résultats. La deuxième rangée de résultats est seulement élaborée quand vous le demandez. Par conséquent, la limite n'a aucun effet. Dans tous les cas, une meilleure requête ne dépend pas du schéma, par exemple PRAGMA user_version. –

0

Comment vous assurer que la connexion et le curseur ne sont jamais fermés?

Vous pouvez avoir un programme basé sur l'état que vous pouvez garantir uniquement les appels close() au bon moment. Ou enveloppez-les dans d'autres objets qui ont une implémentation de réussite close()

Ou ajoutez un membre _isclosed défini par close() et accédé par isclosed().

Questions connexes