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;
Обратите внимание, что это повлияет на все ваши базы данных...