【问题标题】:python - sqlite3 returning wrong resultspython - sqlite3 返回错误的结果
【发布时间】: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 JOINprone to producing very different results..
  • 不幸的是数据是机密的,否则我会共享数据库。
  • 如果您在列不存在时遇到错误,那么您没有使用相同的数据库。
  • 远射:你的 sqlite 库已经过时了。 sqlite.sqlite_version 打印什么? sqlite3.exe -version 告诉你命令行版本使用了什么?

标签: python sqlite


【解决方案1】:

如果您 100% 确定您正在处理同一个数据库,那么您可能正在使用带有命令行工具的较新 SQLite 库版本。

您可以验证正在使用的版本:

print sqlite.sqlite_version

在 Python 中和

sqlite3 -version

使用命令行工具。您可以检查sqlite3 changelog 以查看是否有任何相关更改,或者您可以将您的 SQLite3 DLL 更新到最新版本,以确保您没有在此处遇到错误或新功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多