如果我直接在同一个数据库的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
答案 0 :(得分:0)
如果您100%确定您正在处理同一个数据库,那么您可能正在使用较新的SQLite库版本和命令行工具。
您可以验证正在使用的版本:
print sqlite.sqlite_version
在Python和
中sqlite3 -version
使用命令行工具。您可以检查sqlite3 changelog以查看是否有任何相关更改,或者您只需将SQLite3 DLL更新为最新版本,以确保您没有遇到错误或新功能。