2011-11-11 5 views
15

में पुन: उपयोग करना चाहिए, मैं एक पायथन CGI स्क्रिप्ट लिख रहा हूं जो एक MySQL डेटाबेस से पूछेगा। मैं MySQLdb मॉड्यूल का उपयोग कर रहा हूँ। चूंकि डेटाबेस बार-बार queryed हो जाएगा, मैं इस समारोह ....क्या मुझे कर्सर को पाइथन MySQLdb मॉड्यूल

def getDatabaseResult(sqlQuery,connectioninfohere): 
    # connect to the database 
    vDatabase = MySQLdb.connect(connectioninfohere) 
    # create a cursor, execute and SQL statement and get the result as a tuple 
    cursor = vDatabase.cursor() 
    try: 
     cursor.execute(sqlQuery) 
    except: 
     cursor.close() 
     return None 
    result = cursor.fetchall() 
    cursor.close() 
    return result 

मेरा प्रश्न है ... इस सबसे अच्छा अभ्यास है लिखा? क्या मुझे अपने कर्सर को अपने कार्यों में पुन: उपयोग करना चाहिए? उदाहरण के लिए। कौन सा बेहतर है ...

def callsANewCursorAndConnectionEachTime(): 
    result1 = getDatabaseResult(someQuery1) 
    result2 = getDatabaseResult(someQuery2) 
    result3 = getDatabaseResult(someQuery3) 
    result4 = getDatabaseResult(someQuery4) 

या getDatabaseeResult समारोह के साथ भाग सब एक साथ करते हैं और जैसे कुछ करना ..

def reusesTheSameCursor(): 
    vDatabase = MySQLdb.connect(connectionInfohere) 
    cursor = vDatabase.cursor() 

    cursor.execute(someQuery1) 
    result1 = cursor.fetchall() 

    cursor.execute(someQuery2) 
    result2 = cursor.fetchall() 

    cursor.execute(someQuery3) 
    result3 = cursor.fetchall() 

    cursor.execute(someQuery4) 
    result4 = cursor.fetchall() 

उत्तर

14

MySQLdb डेवलपर कि डीबी पहुँच सामान करता है कि एप्लिकेशन विशिष्ट एपीआई के निर्माण की सिफारिश की आपके लिए ताकि आपको एप्लिकेशन कोड में mysql क्वेरी स्ट्रिंग के बारे में चिंता न करें। यह कोड को थोड़ा अधिक विस्तार योग्य बना देगा (link)।

कर्सर के लिए मेरी समझ यह है कि प्रति ऑपरेशन/लेनदेन प्रति कर्सर बनाना सबसे अच्छी बात है। तो कुछ check value -> update value -> read value लेनदेन का प्रकार एक ही कर्सर का उपयोग कर सकता है, लेकिन अगले के लिए आप एक नया बनायेंगे। यह फिर से सामान्य executeSql विधि होने के बजाय डीबी एक्सेस के लिए एक आंतरिक एपीआई बनाने की दिशा को इंगित कर रहा है।

भी अपने कर्सर को बंद करना याद रखें, और प्रश्नों के बाद कनेक्शन में परिवर्तन करें।

आपका getDatabaseResult फ़ंक्शन प्रत्येक अलग क्वेरी के लिए कनेक्ट होने की आवश्यकता नहीं है। जब तक आप कर्सर के साथ ज़िम्मेदार कार्य करते हैं तब तक आप प्रश्नों के बीच कनेक्शन साझा कर सकते हैं।

+0

बस मुझे जो चाहिए था। धन्यवाद। – b10hazard

+2

एक और छोटी सूचना: MySQLdb कर्सर निर्माण में डीबी को नेटवर्क अनुरोधों के साथ कुछ भी नहीं है, इसलिए यह सस्ता ऑपरेशन है। – Serge