5

我有这样的代码:

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 = [row[1] for row in cursor.fetchall()]
names = [password[1] for password in cursor.fetchall()

我得到了 passw 的值,但名称是空列表。发生了什么?

4

1 回答 1

14

每次之后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)
于 2013-01-07T11:29:10.203 回答