新版本的SQLite能够强制执行外键约束,但为了向后兼容,您必须分别为每个数据库连接打开它!
sqlite> PRAGMA foreign_keys = ON;
Run Code Online (Sandbox Code Playgroud)
我正在使用SQLAlchemy - 我怎样才能确保它始终打开?我试过的是这个:
engine = sqlalchemy.create_engine('sqlite:///:memory:', echo=True)
engine.execute('pragma foreign_keys=on')
Run Code Online (Sandbox Code Playgroud)
......但它不起作用!...我错过了什么?
编辑: 我认为我的真正问题是我安装了多个版本的SQLite,并且Python没有使用最新的版本!
>>> import sqlite3
>>> print sqlite3.sqlite_version
3.3.4
Run Code Online (Sandbox Code Playgroud)
但我刚刚下载了3.6.23并将exe放在我的项目目录中!我怎样才能弄清楚它正在使用哪个.exe并进行更改?
我使用Python 2.6.5构建我的应用程序,它随sqlite3 3.5.9一起提供.显然,正如我在另一个问题中发现的那样,在版本3.6.19之前,sqlite3中没有引入外键支持.但是,Python 2.7附带了sqlite3 3.6.21,所以这项工作 - 我决定在我的应用程序中使用外键,所以我尝试升级到python 2.7.
我正在使用扭曲,我不能为我的生活得到它建立.Twisted依赖于zope.interface而我找不到zope.interface for python 2.7 - 我认为它可能只是"工作",但我必须将所有文件复制到我自己身上,让自己一切正常工作,而不是仅仅使用自安装包.
所以我认为重新构建python 2.6并将其链接到新版本的sqlite3可能更明智.但我不知道 -
我该怎么做?
我安装了Visual Studio 2008作为编译器,我读到这是唯一真正支持Windows的,我运行的是64位操作系统
我从python解释器运行以下代码,并期望insert语句失败并抛出某种异常.但它没有发生:
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 …Run Code Online (Sandbox Code Playgroud)