Fetchall在Python中只返回一列?

use*_*957 5 python mysql-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()
Run Code Online (Sandbox Code Playgroud)

问题是我只能从以下代码访问名称或密码.有了这个,我只能得到用户名.我得到了passw的空列表.现在,如果我切换它:

passw = [row[1] for row in cursor.fetchall()]
names = [password[1] for password in cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)

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

eum*_*iro 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()
Run Code Online (Sandbox Code Playgroud)

另一种可能性是将所有数据存储在列表中,然后将其读取为光标:

records = cursor.fetchall()
names = [record[0] for record in records]
passw = [record[1] for record in records]
Run Code Online (Sandbox Code Playgroud)

或者字典怎么样(名字 - >密码)?

user_pass = dict(cursor.fetchall())
Run Code Online (Sandbox Code Playgroud)

或简单地(如@JonClemens建议):

user_pass = dict(cursor)
Run Code Online (Sandbox Code Playgroud)

  • 我认为这里的关键是`.fetchall()`看起来有点多余,因为游标应该是可迭代的......或者,`list(cursor)`或者我喜欢你的`dict(cursor)`idea :) (2认同)