2011-12-06 21 views
6

HDBC-sqlite3 haskellライブラリを使用して外部キーを有効にしようとしています。このライブラリは小さなヘルパー関数を使用していますSqliteの外部キー

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

これは、sqlite3_openを呼び出します。 sqlite documentationでは、私は外来キーを有効にすると思われるnice sqlite3_db_config関数を見つけました。それをテストするために、私は(リストの2つの最後のもの)sqlite3_open2に素早く2行を追加しました:Foreign Keys: ON/OFF:0 ERR:1

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); 

    ... 

私の驚きは結果でした。

誰かが私に何か間違っているのか、何が外来キーを有効にする適切な方法になるのかをヒントできますか? docsによると

答えて

6

ライブラリは、それはまだ PRAGMA FOREIGN_KEYSコマンドを使用して、実行時にアプリケーションによって有効にする必要があります 、有効な外部キー制約を使用してコンパイルされると仮定。例:

sqlite> PRAGMA foreign_keys = ON;

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

だから、あなたのsqlite3_open()後、あなたはおそらく、次を追加する:言及プラグマがトランザクションを超えて呼び出されるために必要なので

sqlite3_exec(ppDb, "PRAGMA foreign_keys = ON;", 0, 0, 0); 
+0

あなたのソリューションは動作します。あなたはハスケルのレベルで私の問題を解決する方法を尊重して私の目を開いた。私がそれを終えると私はここに投稿します。 – bartoszw

3

私はHDBC-sqlite3の APIを使用して外部キーを有効にするとの難しさを持っていましたライブラリは、接続が確立された後および各コミットの後で新しいトランザクションをバックグラウンドで開きます。それでも回避策は簡単でした:

main = do 
    conn <- connectSqlite3 "test.db" 
    runRaw conn "COMMIT; PRAGMA foreign_keys = ON; BEGIN TRANSACTION" 
関連する問題