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

时间:2011-02-13 23:45:53

标签: 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 个答案:

答案 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)