6

HDBC-sqlite3haskellライブラリを使用して外部キーを有効にしようとしています。このライブラリは少しヘルパーc-関数を使用します

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

これは順番にsqlite3_open1つを呼び出します。sqliteのドキュメントで、外部キーを有効にすることになっている素晴らしいsqlite3_db_config関数を見つけました。それをテストするために、私はすぐに2行を追加しましたsqlite3_open2(リストの最後の2行):

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

誰かが私に何が間違っているのか、または外部キーを有効にする適切な方法は何であるかについてのヒントを教えてもらえますか?

4

2 に答える 2

6

ドキュメントによると:

ライブラリが外部キー制約を有効にしてコンパイルされていると仮定すると、プラグマのforeign_keysコマンドを使用して、実行時にアプリケーションで有効にする必要があります。例えば:

sqlite> PRAGMA external_keys = ON;

外部キー制約はデフォルトで無効になっているため(下位互換性のため)、データベース接続ごとに個別に有効にする必要があります。

したがって、の後にsqlite3_open()、おそらく次を追加する必要があります。

sqlite3_exec(ppDb, "PRAGMA foreign_keys = ON;", 0, 0, 0);
于 2011-12-06T23:04:29.893 に答える
3

前述のPRAGMAはトランザクションを超えて呼び出す必要があり、接続が確立された後、および各コミット後にライブラリがバックグラウンドで新しいトランザクションを開くため、HDBC-sqlite3APIを使用して外部キーを有効にするのに問題がありました。それでも回避策は簡単でした:

main = do
   conn <- connectSqlite3 "test.db"
   runRaw conn "COMMIT; PRAGMA foreign_keys = ON; BEGIN TRANSACTION"
于 2011-12-09T21:50:28.820 に答える