Python中基本SQLite数据库访问的问题
我有一个叫做“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
问题在于,数据库并没有在预期的位置存在。结果,它只是创建了一个空文件和一个空的数据库。