我有一个名为“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保存到变量,但变量打印为[]。 (空)
答案 0 :(得分:2)
我认为你应该迭代cur.fetchall()
而不是cur
- &gt;光标本身。
应该是这样的;
for i in cur.fetchall():
print "item"
print i
您还应删除之前的cur.fetcall()
命令。
答案 1 :(得分:1)
您应该阅读DBAPI docs。但基本上,光标本身不可迭代。最后一个示例显示的方法,例如fetchall
返回列表。您的第一个示例返回列表但被丢弃(未分配)。
从该文档中,fetchall会:
获取查询的所有(剩余)行 结果,将它们作为序列返回 序列(例如元组列表)。 请注意,光标的数组大小 属性可以影响性能 这个操作。
答案 2 :(得分:1)
问题是数据库不存在于预期的位置。反过来,它只是创建了一个空文件和数据库。
答案 3 :(得分:0)
cur.fetchall()
检索所有行,但不将它们保存在变量中。更改为print cur.fetchall()
并删除脚本中的所有内容,或者将fetchall
注释掉,迭代器将起作用:
import sqlite3
db = sqlite3.connect(':memory:')
cur = db.cursor()
cur.execute('create table a(a,b,c,d)')
cur.execute('insert into a values(1,2,3,4)')
cur.execute('insert into a values(2,3,4,5)')
cur.execute('insert into a values(3,4,5,6)')
cur.execute('insert into a values(4,5,6,7)')
cur.execute('select * from a')
for i in cur:
print i
(1, 2, 3, 4)
(2, 3, 4, 5)
(3, 4, 5, 6)
(4, 5, 6, 7)