我尝试使用HDBC-sqlite3 haskell库启用外键。这个库使用了一个小帮助c - 函数
int sqlite3_open2(const char *filename, finalizeonce **ppo)
依次调用sqlite3_open
一个。
在sqlite documentation我发现了很好的sqlite3_db_config
函数,它应该启用外键。为了测试它,我在sqlite3_open2
(列表的最后两个)中快速添加了2行:
int sqlite3_open2(const char *filename, finalizeonce **ppo) {
sqlite3 *ppDb;
finalizeonce *newobj;
int res, *resFK, resFK1;
fprintf(stderr, "DB pointer: %d\n", ppDb);
res = sqlite3_open(filename, &ppDb);
resFK1 = sqlite3_db_config(ppDb, 1002, 1, resFK);
fprintf(stderr, "\nForeign Keys: ON/OFF:%d ERR:%d\n", resFK, resFK1);
...
结果令我惊讶:Foreign Keys: ON/OFF:0 ERR:1
。
有人可以给我一个暗示我做错了什么或者启用外键的正确方法是什么?
答案 0 :(得分:6)
根据docs:
假设在编译库时启用了外键约束, 它必须仍然由应用程序在运行时启用,使用 PRAGMA foreign_keys命令。例如:
源码> PRAGMA foreign_keys = ON;
默认情况下禁用外键约束(对于向后键 兼容性),因此必须为每个数据库单独启用 单独连接。
因此,在sqlite3_open()
之后,您可能希望添加以下内容:
sqlite3_exec(ppDb, "PRAGMA foreign_keys = ON;", 0, 0, 0);
答案 1 :(得分:3)
我在使用 HDBC-sqlite3 API启用外键时遇到了困难,因为提到PRAGMA需要在事务之外调用,并且在建立连接之后和每次提交之后,库会在后台打开新事务。解决方法仍然很简单:
main = do
conn <- connectSqlite3 "test.db"
runRaw conn "COMMIT; PRAGMA foreign_keys = ON; BEGIN TRANSACTION"