2013-01-07 3 views
5

가 나는 코드 같은 있습니다Fetchall은 파이썬에서 하나의 열만 반환합니까?

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

저는 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()가'약간 중복 보인다입니다 중 하나를 생각한다 –

+0

@eumiro, 저는 방금 파이썬 cx_Oracle을 사용하여 테스트했습니다 : records = cursor.fetchall() names = [레코드의 레코드에 대한 레코드 [0] passw = [레코드의 레코드 [1]]이며 이름은 없음입니다. 감사 – Frank

관련 문제