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の空のリストを取得します。今、私がこれを次のように切り替えると:

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

もう1つの可能性は、すべてのデータをリストに格納してから、カーソルであるかのように読み取ることです。

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 に答える