2011-03-04 10 views
49

मैंने आज कुछ सहकर्मियों के साथ पाइथन के डीबी-एपी fetchone बनाम fetchmany बनाम fetchall के बारे में एक चर्चा की थी।पायथन डीबी-एपीआई: fetchone बनाम fetchmany बनाम fetchall

मुझे यकीन है कि इनमें से प्रत्येक के लिए उपयोग का मामला डीबी-एपीआई के कार्यान्वयन पर निर्भर है जिसका उपयोग मैं कर रहा हूं, लेकिन आम तौर पर fetchone बनाम fetchmany बनाम fetchall के लिए उपयोग के मामले क्या हैं?

दूसरे शब्दों में निम्नलिखित समकक्ष हैं? या इनमें से एक है जिसे दूसरों पर पसंद किया जाता है? और यदि ऐसा है तो किस स्थितियों में?

cursor.execute("SELECT id, name FROM `table`") 
for i in xrange(cursor.rowcount): 
    id, name = cursor.fetchone() 
    print id, name 


cursor.execute("SELECT id, name FROM `table`") 
result = cursor.fetchmany() 
while result: 
    for id, name in result: 
     print id, name 
    result = cursor.fetchmany() 


cursor.execute("SELECT id, name FROM `table`") 
for id, name in cursor.fetchall(): 
    print id, name 

उत्तर

13

मुझे लगता है कि यह वास्तव में कार्यान्वयन पर निर्भर करता है, लेकिन आप MySQLdb स्रोतों को देखकर मतभेदों का विचार प्राप्त कर सकते हैं। विकल्पों के आधार पर, mysqldb fetch * पंक्तियों के वर्तमान सेट को स्मृति या सर्वर पक्ष में रखें, इसलिए fetchmany बनाम fetchone में कुछ लचीलापन है यह जानने के लिए कि (पायथन की) मेमोरी में क्या रखना है और डीबी सर्वर पक्ष को क्या रखना है।

पीईपी 24 9 ज्यादा जानकारी नहीं देता है, इसलिए मुझे लगता है कि डेटाबेस के आधार पर चीजों को अनुकूलित करना है जबकि सटीक अर्थशास्त्र कार्यान्वयन-परिभाषित हैं।

+6

मुझे सबसे अधिक स्मृति का उपयोग करके fetchall() के साथ इन उपयोगों की स्मृति में अंतर मिलता है। –

+0

इन तीन fetch आदेशों ने मुझे भी मेरे सिर खरोंच किया था। क्या होगा यदि प्रश्न में पाइथन समान सर्वर पर mySQL सर्वर के रूप में चल रहा है? – SMGreenfield

4

ये कार्यान्वयन विशिष्ट हैं।

  • fetchall

मेज से सभी परिणाम मिलेंगे। तालिका का आकार छोटा होने पर यह बेहतर काम करेगा। यदि तालिका का आकार बड़ा है, तो उन मामलों में fetchall विफल हो जाएगा।

अधिकांश मेमोरी का उपयोग करेगा।

यदि नेटवर्क पर प्रश्न किए जाते हैं तो कुछ समस्याएं हो सकती हैं।

  • fetchmany

fetchmany केवल परिणामों की संख्या आवश्यक हो जाएगा। आप परिणाम और प्रक्रिया उत्पन्न कर सकते हैं। Fetchmany के कार्यान्वयन के सरल स्निपेट।

while True: 
    results = cursor.fetchmany(arraysize) 
    if not results: 
     break 
    for result in results: 
     yield result 
संबंधित मुद्दे