1

我正在尝试在 python 脚本中编写一个对 sqlite 数据库的简单查询。为了测试我的参数是否正确,我尝试从 ipython 命令行运行查询。它看起来像这样:

import sqlite3
db = 'G:\path\to\db\file.sqlite'
conn = sqlite3.connect(db)
results = conn.execute('SELECT * FROM studies').fetchall()

出于某种原因,我的结果完全是空的。然后我尝试了另一个测试查询:

results = conn.execute('SELECT id FROM studies').fetchall()

哪个正确返回。我认为星号 [错误,请参阅下面的第二次更新] 有问题,所以我尝试了从默认 python 命令行中的“SELECT * FROM Studies”查询。瞧,它正确返回。我尝试了所有正常的方法来逃避星号,结果却遇到了各种各样的错误消息。有没有办法在 IPython 中运行这个查询?


编辑:对不起,我错误地认为 IronPython 和 IPython 是一样的。我的意思是 IPython 命令行,而不是 IronPython 框架。


EDIT2:好的,事实证明星号确实有效,如此成功的查询所示:

'SELECT COUNT(*) FROM studies'

从这里发布的建议来看,错误结果是由于尝试返回具有多个字段的记录,即:

'SELECT field1,field2 FROM studies'

这仍然会导致返回记录。我已相应地更改了问题的标题。

4

5 回答 5

1

您可以尝试更多调试:

s = 'SELEECT * from studies'
print s
conn.execute(s).fetchall()

或者:

s = 'SELECT ' + chr(42) + ' from studies'
conn.execute(s).fetchall()

你也可以试试:

conn.execute('select count(*) from studies').fetchall()

如果返回为 [(0,)] 则发生了一些非常奇怪的事情:-)


你可以尝试更多的东西:

conn.execute('select id from (select * from studies)').fetchall()

或者:

cur = conn.cursor()
cur.execute('select * from studies').fetchall()
于 2009-07-15T23:05:46.213 回答
1

这是 SQL。IronPython 与查询处理几乎没有关系。您是否使用了不寻常的字符编码?(IE 不是 UTF-8 或 ASCII)?

如果你会发生什么SELECT id,fieldname,fieldname FROM studies(换句话说,模拟 '*' 的作用。)

于 2009-07-15T20:06:32.407 回答
1

我已经尝试了你在 IPython 和 sqlite 中提到的所有东西,没有任何问题(ipython 0.9.1,python 2.5.2)。

有没有可能这是某种版本不匹配的问题?也许你的 shell 引用了不同的库?

例如,是否

import sqlite3; print sqlite3.version

从两个shell返回相同的东西(即ipython和sql查询工作的常规)?

怎么样

conn.execute('select sqlite_version()').fetchall()

这会返回同样的东西吗?

于 2009-07-16T06:08:35.723 回答
0

只是一个疯狂的猜测,但请尝试转义数据库文件路径中的反斜杠。换句话说,而不是

db = 'G:\path\to\db\file.sqlite'

尝试

db = 'G:\\path\\to\\db\\file.sqlite'
于 2009-07-15T22:28:29.580 回答
0

我遇到了类似的问题,发现获得正确输出的唯一方法是将执行语句的结果分配给另一个游标对象并在其上调用 fetchall:

In [1]: import sqlite3
In [2]: conn = sqlite3.connect('file.db')
In [3]: cur = conn.cursor()
In [4]: cur2 = cur.execute("<STATEMENT>")
In [5]: cur2.fetchall()
于 2021-02-16T18:18:59.253 回答