SQLite3 “esquece” de usar chaves estrangeiras
Estou usando Ruby com SQLite3 e minhas tentativas de usar chaves estrangeiras no Sqlite3 infelizmente não tiveram sucesso. De acordo comsqlite3 --version
, a versão 3.7.13 está instalada. Tanto quanto sei, o Sqlite3 suporta chaves estrangeiras desde a versão 3.6.x.
Eu sei que chaves estrangeiras são desativadas por padrão e precisam ser ativadas comPRAGMA foreign_keys = ON;
. No meu script de criação de banco de dados Ruby, estou fazendo algo assim:
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)
Infelizmente, posso inserir linhas emrequests
com IDs de aplicativos desconhecidos, funciona, mas é claro que não deveria.
Interessante: usando o shell sqlite3 diretamente, posso observar o seguinte comportamento:
$ 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 ?!
Sem sair do shell sqlite3, chaves estrangeirasestão trabalhando depois de ativá-los (e não sair do shell) eEu não estou autorizado para inserir linhas com app_ids desconhecidos.