SQLite3“忘记”使用外键

我正在使用Ruby和SQLite3,但我在Sqlite3中使用外键的尝试很不幸。 根据sqlite3 --version ,安装了3.7.13版。 据我所知,自3.6.x版以来,Sqlite3支持外键。

我知道默认情况下外键被禁用,必须使用PRAGMA foreign_keys = ON;激活PRAGMA foreign_keys = ON; 。 在我的Ruby db-create-script中,我正在做这样的事情:

 sql = <<-SQL PRAGMA foreign_keys = ON; CREATE TABLE apps ( id .... ); CREATE TABLE requests ( ... app_id INTEGER NOT NULL, FOREIGN KEY(app_id) REFERENCES apps(id), ); ... SQL db.execute_batch(sql) 

不幸的是,我可以愉快地将行插入到具有未知app-id的requests ,它可以工作,但当然不应该。

有意思:直接使用sqlite3 shell,我可以观察到以下行为:

 $ sqlite3 database.db sqlite> PRAGMA foreign_keys = ON; sqlite> PRAGMA foreign_keys; 1 // as expected sqlite> .quit $ sqlite3 database.db sqlite> PRAGMA foreign_keys; 0 // off ?! 

在不退出sqlite3 shell的情况下,外键在激活它们之后正在工作 (而不是退出shell), 我不允许插入包含未知app_ids的行。

我想我可以回答我自己的问题:文档说:默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接启用。 很讨厌,但它现在终于奏效了。

将它放在执行SQL命令的文件的顶部,它将在运行时启用外键。

 db = SQLite3::Database.new("database.db") db.execute("PRAGMA foreign_keys = ON") 

默认情况下永久打开foreign_keys的一种方法是~/.sqliterc下行注入~/.sqliterc

 PRAGMA foreign_keys = ON; 

请注意,它会影响您的所有数据库……

Interesting Posts