2009-12-30 7 views
10

मान लें कि आपके पास निम्न कोड है:कैसे बताएं कि पाइथन SQLite डेटाबेस कनेक्शन या कर्सर बंद है या नहीं?

import sqlite3 

conn = sqlite3.connect('mydb') 
cur = conn.cursor() 
# some database actions 
cur.close() 
conn.close() 
# more code below 

अगर मैं बाद में conn या cur ऑब्जेक्ट्स का उपयोग करने का प्रयास करता हूं, तो मैं कैसे कह सकता हूं कि वे बंद हैं? मुझे .isclosed() विधि या ऐसा कुछ भी नहीं मिल रहा है।

उत्तर

10

आप एक 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. 

यह एक shortcut specific to sqlite3 पर निर्भर करता है।

+7

विधि सौंपा गया है, लेकिन 'मेरा चयन करें' से बचें, जबकि आप बहुत हल्का कर सकते हैं 'mytable LIMIT 1 से चुनें एक_column'। पूर्व बहुत अक्षम है क्या आपके पास एक छोटा-छोटा डेटाबेस है। –

+0

धन्यवाद @pitrou, इसे ध्यान में रखने के लिए अद्यतन किया गया। – bernie

+3

@ एंटोनीपी। आप अन्य डेटाबेस के साथ SQLite उलझन में हैं। SQLite द्वारा किए गए काम की मात्रा में कोई अंतर नहीं है। यह किसी क्वेरी के लिए सभी परिणामों की गणना नहीं करता है - इसके बजाय यह पहली परिणाम पंक्ति देने के लिए कम से कम काम करता है। दूसरी परिणाम पंक्ति केवल तभी काम की जाती है जब आप इसके लिए पूछते हैं। नतीजतन सीमा का कोई प्रभाव नहीं पड़ता है। किसी भी घटना में एक बेहतर क्वेरी वह है जो स्कीमा पर निर्भर नहीं है - उदाहरण के लिए PRAGMA user_version। –

0

यह सुनिश्चित करने के बारे में कि कनेक्शन और कर्सर कभी बंद नहीं होते हैं?

आपके पास एक राज्य आधारित प्रोग्राम हो सकता है जिसे आप सही समय पर केवल कॉल() को कॉल कर सकते हैं।

या उन अन्य वस्तुओं में लपेटें जिनके पास close() का पास कार्यान्वयन है। या सदस्य close() द्वारा सेट सदस्य जोड़ें और isclosed() द्वारा एक्सेस किया गया।