2013-01-07 10 views
5

मैं एक एक कोड इस तरह है:Fetchall Python में केवल एक कॉलम लौट रहा है?

db = MySQLdb.connect(user='root', db='galaxy', passwd='devil', host='localhost') 
cursor = db.cursor() 
cursor.execute('SELECT username, password FROM galaxy_user') 
names = [row[0] for row in cursor.fetchall()] 
passw = [password[1] for password in cursor.fetchall()] 
db.close() 

समस्या मैं केवल या तो नाम का उपयोग या निम्न कोड से passw कर सकते हैं। इसके साथ ही मैं केवल उपयोगकर्ता नाम प्राप्त कर सकता हूं। मुझे पासव के लिए खाली सूची मिलती है। अब अगर मैं इसे इस तरह स्विच करता हूं:

passw = [row[1] for row in cursor.fetchall()] 
names = [password[1] for password in cursor.fetchall() 

मुझे पासव का मूल्य मिलता है लेकिन नाम खाली सूची है। क्या हो रहा है?

उत्तर

13

प्रत्येक cursor.execute के बाद आप केवल एक बार cursor.fetchall का उपयोग कर सकते हैं। यह कर्सर को "निकास" करता है, उसका पूरा डेटा प्राप्त होता है और फिर इसे फिर से "पढ़ा नहीं जा सकता"।

निम्नलिखित कोड के साथ

आप एक ही समय में सभी डेटा पढ़ें:

db = MySQLdb.connect(user='root', db='galaxy', passwd='devil', host='localhost') 
cursor = db.cursor() 
cursor.execute('SELECT username, password FROM galaxy_user') 
names, passw = zip(*cursor.fetchall()) 
db.close() 

एक और संभावना एक सूची में सभी डाटा स्टोर और फिर इसे पढ़ने के रूप में अगर यह एक कर्सर थे करने के लिए होगा:

records = cursor.fetchall() 
names = [record[0] for record in records] 
passw = [record[1] for record in records] 

या कैसे एक शब्दकोश (नाम -> पासवर्ड) के बारे में?

user_pass = dict(cursor.fetchall()) 

या बस (के रूप में @JonClemens सुझाव):

user_pass = dict(cursor) 
+2

मुझे लगता है कि कुंजी है कि यहाँ '.fetchall()' के रूप में कर्सर iterable होना चाहिए लगता है थोड़ा निरर्थक है ... या तो, 'सूची (कर्सर)' या मुझे आपके 'dict (कर्सर) 'विचार पसंद है :) –

+0

@ यूमिरो, मैंने अभी पायथन सीएक्स_ऑरेकल का उपयोग करके परीक्षण किया है: रिकॉर्ड्स = कर्सर.फेटचॉल() नाम = [रिकॉर्ड [0] रिकॉर्ड में रिकॉर्ड के लिए] passw = [रिकॉर्ड [1] रिकॉर्ड में रिकॉर्ड के लिए] और नाम कोई नहीं है। धन्यवाद – Frank

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