2011-07-19 19 views
9

私のdjangoプロジェクトでは、本番用にはmysql dbを使用し、テスト用にはsqliteを使用します。djangoのsqliteで整合性チェックを有効にする

問題は、コードの一部がモデルの整合性チェックに依存していることです。これはmysqlとうまく動作しますが、同じコードがテストで実行されたときには完全性エラーはスローされません。

私がチェックした外部キ​​ーがsqliteので活性化されなければならないことを知っている:

PRAGMA foreign_keys = 1; 

この活性化(same question here)を行うための最善の方法である場合しかし、私は知りません。

また、次のコードは動作しません。

def test_method(self): 
    from django.db import connection 
    cursor = connection.cursor() 
    cursor.execute('PRAGMA foreign_keys = ON') 
    c = cursor.execute('PRAGMA foreign_keys') 
    print c.fetchone() 
    >>> (0,) 

任意のアイデア?

+3

なぜあなたは、生産に使用されているテストのための同じDBを使用していませんか?テスト環境の目的は生産環境を再現することではありませんか?* –

+0

'time python manage.py test products'を使用して単一のアプリケーションをテストします。 Mysql:0m58.232s。 Sqlite:0m5.153s。 –

+0

ここでは解決策がひとつ始まったわけではありませんが、あなたがここで上げようとしている問題についてこのチケットで多くの議論が行われているように見えます。https://code.djangoproject.com/ticket/11665 – NiKo

答えて

14

最終的に正しい答えが見つかった場合。私がしなければならなかったすべては私のインストールされたアプリの一つで__init__.pyファイルにこのコードを追加しました:

from django.db.backends.signals import connection_created 


def activate_foreign_keys(sender, connection, **kwargs): 
    """Enable integrity constraint with sqlite.""" 
    if connection.vendor == 'sqlite': 
     cursor = connection.cursor() 
     cursor.execute('PRAGMA foreign_keys = ON;') 

connection_created.connect(activate_foreign_keys) 
+0

これはsyncdbの間に追加された[初期データ](https://docs.djangoproject.com/en/dev/howto/initial-data/)では動作しません。 – user240515

+0

外部キーを作成しない古い移行ファイルは必ず削除してください。そうしないと、外部キーは作成されません。私はこれでしばらくトラップされました。 – fossilet

+1

DBファイルを削除して以前のすべての移行を削除し、新しい移行を作成しましたが、これは私には違いがありませんでした。テーブルは "on delete cascade"で期待通りに作成されませんでした。私はなぜそれが起こっていないのだろうかと思う。 –

2

post_syncdbを聞いて、django信号を使うことができます。

from django.db.models.signals import post_syncdb 

def set_pragma_on(sender, **kwargs): 
    "your code here" 

post_syncdb.connect(set_pragma_on) 

これはsyncdbの実行が実行されるたびに、あなたのSQLiteデータベースが「オン」に「プラグマ」を設定していること、(テスト用データベースを作成するときにsyncdbの実行は、実行される)ことを保証します。上記の 'set_pragma_on'メソッドで使用しているデータベースを確認する必要があります。

+0

あなたの答えは完全に正しいわけではありませんが、正しい解決策に向かって私を導いてくれました(同じページの私の答えを見てください)。ムチョス・グラ​​シアス。 –

+0

'post_syncdb'コマンドは' syncdb'の後にのみ実行され、他の接続では実行されません(プラグマは現在の接続を超えて持続しません)。 –

関連する問題