2009-12-30 9 views

Antwort

10

Sie in einer try, except Anweisung wickeln könnte:

>>> 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. 

Dies beruht auf einer shortcut specific to sqlite3.

+7

Die Methode ist gesund, aber vermeiden Sie eine 'SELECT * FROM Mytable', während Sie eine viel hellere 'SELECT one_column FROM mytable LIMIT 1' tun können. Ersteres ist schrecklich ineffizient, wenn Sie eine nicht-kleine Datenbank haben. –

+0

danke @pitrou, aktualisiert um dies zu berücksichtigen. – bernie

+3

@ AntoineP. Sie verwechseln SQLite mit anderen Datenbanken. Es gibt keinen Unterschied in der Menge der von SQLite ausgeführten Arbeit. Es werden nicht alle Ergebnisse für eine Abfrage im Voraus berechnet, sondern es wird so wenig Arbeit wie möglich für die erste Ergebniszeile ausgeführt. Die zweite Ergebniszeile wird nur ausgearbeitet, wenn Sie danach gefragt werden. Folglich hat das Limit keine Auswirkung. In jedem Fall ist eine bessere Abfrage eine Abfrage, die nicht vom Schema abhängt - zB PRAGMA user_version. –

0

Wie stellen Sie sicher, dass die Verbindung und der Cursor nie geschlossen sind?

Sie könnten ein state-based Programm haben, das Sie nur garantieren können, dass closes() zur richtigen Zeit.

Oder wickeln Sie sie in andere Objekte, die eine Pass-Implementierung von close() haben. Oder fügen Sie ein _isclosed Element hinzu, das von close() festgelegt wird und auf isclosed() zugegriffen wird.