2011-01-06 7 views
7

मैं सोच रहा था कि मैं अपने एसक्लाइट डीबी कनेक्शन को जगह पर एक क्वेरी को जोड़ने और निष्पादित करने के लिए आवश्यक 6 लाइनों की प्रतिलिपि बनाने/चिपकाने के बजाय एक फ़ंक्शन बनाने की कोशिश करूंगा। मैं इसे बहुमुखी बनाना चाहता हूं इसलिए मैं एक ही फ़ंक्शन का उपयोग/चयन/सम्मिलित/आदि के लिए उपयोग कर सकता हूं ...क्या मैं अपने स्क्लाइट कनेक्शन और कर्सर को फ़ंक्शन में डाल सकता हूं?

नीचे मैंने जो कोशिश की है। 'INSERT' और 'CREATE टेबल' क्वेरी काम कर रहे हैं, लेकिन यदि मैं 'चयन' क्वेरी करता हूं, तो मैं फ़ंक्शन के बाहर लाने वाले मानों के साथ कैसे काम कर सकता हूं?
आमतौर पर मैं इसे प्राप्त मूल्यों को मुद्रित करना चाहता हूं और उनके साथ अन्य चीजें भी करना चाहता हूं।

जब मैं इसे पसंद नीचे मैं एक त्रुटि मिलता है

Traceback (most recent call last): 
File "C:\Users\steini\Desktop\py\database\test3.py", line 15, in <module> 
for row in connection('testdb45.db', "select * from users"): 
ProgrammingError: Cannot operate on a closed database. 

तो मुझे लगता है कि कनेक्शन खुला तो मैं कर्सर से मान प्राप्त कर सकते होने की जरूरत है, लेकिन मैं इसे इतना फ़ाइल प्रतिसाद नहीं बंद करने की आवश्यकता हमेशा बंद नहीं है।

import sqlite3 

def connection (db, arg, cubby): 
    conn = sqlite3.connect(db) 
    conn.execute('pragma foreign_keys = on') 
    cur = conn.cursor() 
    cur.execute(arg) 
    for row in cur: 
     cubby.append(row) 
    conn.commit() 
    conn.close() 

cubby=[] 
connection('testdb.db', "create table users ('user', 'email')", cubby) 
connection('testdb.db', "insert into users ('user', 'email') values ('joey', '[email protected]')", cubby) 
for row in connection('testdb45.db', "select * from users", cubby): 
    print row 

मैं कैसे यह काम कर सकते हैं:

यहाँ मेरी परीक्षण कोड है?

संपादित करें: तो यह एक बाहरी सूची में जुड़ जाता है, कोड एक छोटे से तो CUR मूल्यों संशोधित, लेकिन अभी भी बहुत बुरा

उत्तर

15

मुझे लगता है कि समस्या एक छोटे से अधिक कठिन की तुलना में यह पहली बार में दिखता है।

आपको त्रुटि दिखाई दे रही है क्योंकि आपने अपने "कनेक्शन" फ़ंक्शन में डेटाबेस से अपना कनेक्शन बंद कर दिया है।

एक कनेक्शन प्रबंधित करने के लिए, डेटाबेस प्रबंधन श्रेणी बनाने से शायद बेहतर है।

कुछ की तरह:

dbmgr = DatabaseManager("testdb.db") 
for row in dbmgr.query("select * from users"): 
    print row 

यह कनेक्शन वस्तु के अस्तित्व की अवधि के लिए खुला रखना होगा:

import sqlite3 

class DatabaseManager(object): 
    def __init__(self, db): 
     self.conn = sqlite3.connect(db) 
     self.conn.execute('pragma foreign_keys = on') 
     self.conn.commit() 
     self.cur = self.conn.cursor() 

    def query(self, arg): 
     self.cur.execute(arg) 
     self.conn.commit() 
     return self.cur 

    def __del__(self): 
     self.conn.close() 

तो फिर तुम जैसे कुछ करने के लिए सक्षम होना चाहिए।

आपको अभी भी यह एक गहरी समस्या हो सकती है, लेकिन आसपास खेलें और देखें कि आपके लिए क्या काम करता है।

+0

भयानक, मुझे इसके साथ कुछ और गड़बड़ करनी होगी, लेकिन अब तक यह वर्ग पूरी तरह से काम कर रहा है जो मैं कर रहा हूं। धन्यवाद –

+1

माइनर नाइट, लेकिन आपको एक की आवश्यकता है: आपके दूसरे कोड ब्लॉक में स्टेटमेंट के बाद :) –

0

यह विफल रहा है क्योंकि आपका कार्य लौटने से पहले कनेक्शन बंद कर देता है। इसे ठीक करने का तरीका फ़ंक्शन को जेनरेटर में बदलना है जो परिणामों पर गुजरता है। निम्नलिखित अपरीक्षित कोड की तरह कुछ काम करना चाहिए:

def connection (db, arg): 
    conn = sqlite3.connect(db) 
    conn.execute('pragma foreign_keys = on') 
    cur = conn.cursor() 
    cur.execute(arg) 
    for row in cur: 
     yield row 
    conn.commit() 
    conn.close() 

आप अतिरिक्त जब इस कार्यप्रणाली को कॉल सभी पंक्तियों का उपभोग करने के लिए सावधान रहना करने के लिए, क्योंकि यदि आप तो नहीं है कनेक्शन बंद कर दिया नहीं किया जाएगा। आप with वाक्यविन्यास के लिए आवश्यक कार्यों को लागू करने के द्वारा इस समस्या से बचने में सक्षम हो सकते हैं।

संबंधित मुद्दे