【发布时间】:2014-01-04 02:09:08
【问题描述】:
如果我直接在同一数据库上的 sqlite3.exe 中运行此查询,我会得到 20 条记录。
当我使用 sqlite3 在 Python 中运行它时,它会返回表 a (200000+) 中的每条记录。
import sqlite3
db = sqlite3.connect("path/to/my.db")
c = db.cursor()
c.execute("""SELECT a.*, b.*, c.* FROM t_data a NATURAL LEFT JOIN t_finished b
NATURAL LEFT JOIN user_info c WHERE user_id=1;""")
for row in c:
print row
这怎么可能?
这是表的关联方式。
CREATE TABLE t_data ( t_id INTEGER REFERENCES t_finished (t_id),
ui_id INTEGER NOT NULL REFERENCES user_info (ui_id), ...);
CREATE TABLE t_finished ( t_id INTEGER PRIMARY KEY, ...);
CREATE TABLE user_info ( ui_id INTEGER PRIMARY KEY, user_id INTEGER REFERENCES accounts, ...);
它们之间没有共享其他列。
尝试使用显式 JOINS 我遇到了同样的问题:
SELECT * FROM t_data a LEFT JOIN t_finished b USING(t_id) LEFT JOIN user_info c USING(ui_id) WHERE user_id=1;
此查询在 sqlite3.exe 中有效,但在 Python 中抛出错误:
OperationalError: cannot join using column ui_id - column not present in both tables
【问题讨论】:
-
有没有机会给我们一个SSCCE 数据集?我当然不能用一些测试数据在本地重现你的问题。
-
您确定没有将列添加到数据库中吗?当你这样做时,
NATURAL JOIN是 prone to producing very different results.. -
不幸的是数据是机密的,否则我会共享数据库。
-
如果您在列不存在时遇到错误,那么您没有使用相同的数据库。
-
远射:你的 sqlite 库已经过时了。
sqlite.sqlite_version打印什么?sqlite3.exe -version告诉你命令行版本使用了什么?