SQLite3 "забывает" использовать внешние ключи

Я использую Ruby с SQLite3, и мои попытки использовать внешние ключи в Sqlite3, к сожалению, не были успешными. В соответствии с sqlite3 --version установлена ​​версия 3.7.13. Насколько я знаю, Sqlite3 поддерживает внешние ключи с версии 3.6.x.

Я знаю, что внешние ключи дезактивируются по умолчанию и должны быть активированы с помощью 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)

К сожалению, я могу с радостью вставлять строки в requests с неизвестными приложениями, это работает, но, конечно, это не должно.

Интересно: напрямую используя оболочку sqlite3, я могу наблюдать следующее поведение:

$ 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 внешние ключи работают после их активации (и не покидают оболочку) и мне не разрешено вставлять строки с неизвестными app_ids.

Ответ 1

Думаю, я могу ответить на свой вопрос: в документации говорится: "Ограничения по внешним ключам по умолчанию отключены (для обратной совместимости), поэтому необходимо включить для каждое подключение к базе данных отдельно. Раздражает, но, наконец, работает.

Ответ 2

Поместите это в начало файла, который выполняет команды SQL, и он будет включать внешние ключи во время выполнения.

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

Ответ 3

Один из способов постоянного включения foreign_keys по умолчанию - ввести следующую строку в ~/.sqliterc:

PRAGMA foreign_keys = ON;

Обратите внимание, что это повлияет на все ваши базы данных...