Python中基本SQLite数据库访问的问题

2 投票
4 回答
1379 浏览
提问于 2025-04-16 11:46

我有一个叫做“default.db”的数据库,这个数据库是可以正常使用的[我可以通过SQLite工具访问它,并查看里面的表格]。

我有一段代码用来访问这个数据库:

from pysqlite2 import dbapi2 as sqlite

conn = sqlite.connect("default.db")
cur = conn.cursor()

#retrieve all database data

cur.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;")
print "fetch all"
cur.fetchall()

print "printing"
print cur
print conn
for i in cur:
    print "item"
    print i

运行后输出是:

fetch all
printing
<pysqlite2.dbapi2.Cursor object at 0xb74a2de0>
<pysqlite2.dbapi2.Connection object at 0xb74713d8>
done

但是如果我单独运行这些命令,我从代码中得到的结果是:

>>> cur.fetchall()
[(u'cards',), (u'data_for_fact',), (u'fact_views',), (u'fact_views_for_card_type',), (u'facts',), (u'global_variables',), (u'log',), (u'sqlite_sequence',), (u'tags',), (u'tags_for_card',)]

我的问题是:我该怎么解决这个问题,哪里出了错?我在连接数据库的时候没有收到任何错误提示[没有报告任何错误]。

补充:我尝试把fetchall的结果保存到一个变量里,但这个变量打印出来是[]。(空的)

4 个回答

1

你可能应该看看DBAPI文档。简单来说,游标(cursor)本身是不能直接用来遍历的。像fetchall这样的函数会返回一个列表,就像你最后的例子所展示的那样。而你第一个例子虽然返回了列表,但没有保存下来(没有赋值)。

根据那个文档,fetchall的作用是:

获取查询结果中所有(剩余的)行,并将它们作为一个序列的序列返回(例如,一个元组的列表)。请注意,游标的数组大小属性可能会影响这个操作的性能。

2

我觉得你应该遍历 cur.fetchall() 的结果,而不是直接遍历 cur 这个游标。

应该像这样;

for i in cur.fetchall():
    print "item"
    print i

另外,你也应该去掉之前的 cur.fetcall() 这个命令。

1

问题在于,数据库并没有在预期的位置存在。结果,它只是创建了一个空文件和一个空的数据库。

撰写回答