2013-01-07 68 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得到空的列表。現在,如果我切換這樣的:

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

我得到的passw值,但名稱是空列表。發生了什麼?

回答

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()'似乎有點多餘的,因爲遊標應該是迭代的......不是, 'list(cursor)'或者我喜歡你的'dict(光標)'的想法:) –

+0

@eumiro,我剛測試過使用Python cx_Oracle:records = cursor.fetchall() names = [記錄[0] passw = [記錄[1]用於記錄記錄]並且名稱爲無。謝謝 – Frank