【问题标题】:Why aren't my sqlite3 foreign keys working?为什么我的 sqlite3 外键不起作用?
【发布时间】:2011-03-18 18:50:12
【问题描述】:

我从 python 解释器运行以下代码,并期望插入语句失败并引发某种异常。但它没有发生:

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.connect("test.db")
>>> conn.executescript("""
... pragma foreign_keys=on;
... begin transaction;
... create table t1 (i integer primary key, a);
... create table t2 (i, a, foreign key (i) references t1(i));
... commit;
... """)
<sqlite3.Cursor object at 0x0229DAA0>
>>> c = conn.cursor()
>>> c.execute("insert into t2 values (6, 8)")
<sqlite3.Cursor object at 0x0229DAD0>
>>> #???
...
>>> conn.commit()
>>> #???????????
...
>>> c.execute("select * from t2")
<sqlite3.Cursor object at 0x0229DAD0>
>>> c.fetchall()
[(6, 8)]
>>> #but why!?
...
>>>

有谁知道为什么这不起作用?我的理解是插入应该失败,因为我为t2(i) 提供的值不是t1 中的主键,但它还是很乐意这样做......?

【问题讨论】:

    标签: python foreign-keys sqlite


    【解决方案1】:

    SQLite 中的工作外键支持是非常新的——它仅在 10 月 14 日的 3.6.19 中发布。您确定您使用的是 SQLite 3.6.19 或更高版本吗?

    检查 sqlite3 模块中的 sqlite_version 常量。例如。在默认安装 python/sqlite 的 Mac OS X 10.6 系统上:

    >>> import sqlite3
    >>> sqlite3.sqlite_version
    '3.6.12'
    >>> 
    

    【讨论】:

    • 我想说我必须,因为我可以让它与 sqlite 交互式解释器一起工作,但后来我意识到 python 有它自己的内置 sqlite -- 我必须有一个新的我的系统,但不在我的 python 中。谢谢
    【解决方案2】:

    正如 Nicholas 所说,检查您的 sqlite 版本是否支持外键。如果 sqlite 的版本大于或等于 3.6.19,这无关紧要。可以在关闭外键支持的情况下编译源代码。要检查执行以下命令。

    cursor.execute("PRAGMA foreign_keys")

    如果它不返回任何数据,那么您的版本不支持外键。

    注意:目前在 sqlite3 中未强制执行外键支持。查看here

    【讨论】:

    • 不是吗?在 sqlite 3.8.10 中,打开 foreign_keys 杂注似乎可以很好地执行它
    • 根据他们的文档,它没有。到目前为止,我还没有找到任何怀疑的理由,因为我的数据库的行为就是这样。无论如何,我会检查版本 3.8.10。
    • 我用我的 python 3.5 安装的 sqlite3 模块(使用 3.8.11)进行了尝试,那里也支持外键约束。违反给我一个sqlite3.IntegrityError: FOREIGN KEY constraint failed
    猜你喜欢
    • 2020-03-22
    • 2020-02-20
    • 2022-08-22
    • 2022-12-22
    • 2012-12-07
    • 2019-07-15
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多