如何使用Python从SQLite获取数据?

11

我正在使用这个样本SQLite数据库,我的代码是:

import sqlite3

conn = sqlite3.connect('chinook.db')
conn.execute("SELECT * FROM tracks")
rows = conn.cursor().fetchall()

这本应该起作用的,但是rows为空?
我在这里做错了什么吗?


2
你永远不会调用 .execute() 游标。 - Corion
1
@Corion: conn.execute() 是一个快捷方式。然而,它返回的是游标,这就是问题所在。 - 9769953
执行 cursor() 的正确方法是什么?是 conn.cursor().fetchall(); conn.execute() 吗? - Eka
@Eka:所有的内容都在文档中。 - 9769953
1个回答

11
Connection.execute 是一个快捷方式,返回一个cursor实例,需要使用fetchall方法来访问数据。在您的代码中,您正在创建一个新的独立游标。

因此:

import sqlite3

conn = sqlite3.connect('chinook.db')
cursor = conn.execute("SELECT * FROM tracks")
rows = cursor.fetchall()

甚至更短(不建议这样做,但适用于喜欢晦涩难懂的一行代码):

rows = sqlite3.connect('chinook.db').execute("SELECT * FROM tracks").fetchall()

或者不要使用Connection.execute的快捷方式,以避免混淆:

import sqlite3

conn = sqlite3.connect('chinook.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM tracks")
rows = cursor.fetchall()

虽然OP使用的是Python 2,但是只要加上括号,你的代码在两个版本中都可以完美运行。这是目前在Google上使用Python与SQLite的最热门结果之一,所以看到你的答案的大多数人都在使用Python 3。由于OP可能早已离开,你能否重新考虑使答案适用于两个版本? - Pikamander2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接