2013-01-07 10 views
5

Ich habe ein ein Code wie folgt aus:Fetchall, das nur eine Spalte in Python zurückgibt?

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() 

Das Problem ist, ich nur entweder Namen zugreifen können oder aus dem folgenden Code passw. Mit diesem kann ich nur den Benutzernamen erhalten. Ich bekomme eine leere Liste für passw. Nun, wenn ich das so umschalte:

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

Ich bekomme den Wert von passw aber Namen ist leere Liste. Was ist los?

Antwort

13

Nach jeder cursor.execute können Sie cursor.fetchall nur einmal verwenden. Es "erschöpft" den Cursor, erhält alle Daten und kann dann nicht mehr "gelesen" werden.

Mit folgendem Code lesen Sie alle Daten zur gleichen Zeit:

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() 

Eine weitere Möglichkeit, alle Daten in einer Liste zu speichern wäre und lesen Sie es dann, als ob es ein Cursor war:

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

Oder wie wäre es mit einem Wörterbuch (Name -> Passwort)?

user_pass = dict(cursor.fetchall()) 

oder einfach (wie @JonClemens vorgeschlagen):

user_pass = dict(cursor) 
+2

Ich denke, der Schlüssel ist hier, dass '.fetchall()' ein bisschen überflüssig scheint, als die Cursor iterable sein sollte ... Entweder, 'list (cursor)' oder Ich mag deine 'dict (cursor)' Idee :) –

+0

@eumiro, ich habe gerade mit Python getestet cx_Oracle: records = cursor.fetchall() namen = [record [0] für record in records] passw = [Datensatz [1] für Datensatz in Datensätzen) und Name ist None. Vielen Dank – Frank