Sqlite Foreign Keys - PullRequest
       24

Sqlite Foreign Keys

6 голосов
/ 07 декабря 2011

Я пытаюсь включить внешние ключи, используя библиотеку HDBC-sqlite3 haskell. Эта библиотека использует маленький помощник c - функция

int sqlite3_open2(const char *filename, finalizeonce **ppo)

который в свою очередь вызывает sqlite3_open один. В документации sqlite я нашел замечательную функцию sqlite3_db_config, которая должна включать внешние ключи. Чтобы проверить это, я быстро добавил 2 строки в sqlite3_open2 (две последние из списка):

int sqlite3_open2(const char *filename, finalizeonce **ppo) {
  sqlite3 *ppDb;
  finalizeonce *newobj;
  int res, *resFK, resFK1;

  fprintf(stderr, "DB pointer: %d\n", ppDb);

  res = sqlite3_open(filename, &ppDb);

  resFK1 = sqlite3_db_config(ppDb, 1002, 1, resFK);                    
  fprintf(stderr, "\nForeign Keys: ON/OFF:%d  ERR:%d\n", resFK, resFK1);  

  ...

Мое удивление было результатом: Foreign Keys: ON/OFF:0 ERR:1.

Может ли кто-нибудь подсказать мне, что я делаю неправильно или как правильно включить внешние ключи?

Ответы [ 2 ]

6 голосов
/ 07 декабря 2011

В соответствии с документами :

Если библиотека скомпилирована с включенными ограничениями внешнего ключа, она все равно должна быть включена приложением во время выполнения с помощью команды PRAGMA foreign_keys,Например:

sqlite> PRAGMA foreign_keys = ON;

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

Итак, после вашего sqlite3_open() вы, вероятно, захотите добавить следующее:

sqlite3_exec(ppDb, "PRAGMA foreign_keys = ON;", 0, 0, 0);
3 голосов
/ 10 декабря 2011

У меня были трудности с включением внешних ключей с использованием HDBC-sqlite3 API, потому что упомянутый PRAGMA требовалось вызывать вне транзакции, и библиотека открывает в фоновом режиме новую транзакцию после установления соединения и после каждой фиксации. Тем не менее, обходной путь был простым:

main = do
   conn <- connectSqlite3 "test.db"
   runRaw conn "COMMIT; PRAGMA foreign_keys = ON; BEGIN TRANSACTION"
...