SQLite3"忘记"使用外键

car*_*ara 15 ruby sql sqlite raspbian

我正在使用带有SQLite3的Ruby,但我在Sqlite3中尝试使用外键却很不成功.根据sqlite3 --version,版本3.7.13已安装.据我所知,自3.6.x版以来,Sqlite3支持外键.

我知道默认情况下外键被禁用,必须激活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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,我可以愉快地requests使用未知的app-id 插入行,它可以工作,但当然不应该.

有意思:直接使用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 ?!
Run Code Online (Sandbox Code Playgroud)

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

car*_*ara 26

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


oco*_*onn 10

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

db = SQLite3::Database.new("database.db")
db.execute("PRAGMA foreign_keys = ON")
Run Code Online (Sandbox Code Playgroud)


Onl*_*job 8

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

PRAGMA foreign_keys = ON;
Run Code Online (Sandbox Code Playgroud)

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