10

私の django プロジェクトでは、本番用に mysql db を使用し、テスト用に sqlite を使用しています。

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

sqlite で外部キーのチェックを有効にする必要があることはわかっています。

PRAGMA foreign_keys = 1;

ただし、このアクティベーションを行う最良の方法がどこにあるのかわかりません (同じ質問はこちら)。

さらに、次のコードは機能しません。

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

何か案は?

4

2 に答える 2

18

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

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)
于 2011-07-27T10:53:29.787 に答える
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 が実行されるたびに (テスト データベースの作成時に syncdb が実行される)、SQLite データベースで 'pragma' が 'on' に設定されていることが保証されます。上記のメソッド「set_pragma_on」で使用しているデータベースを確認する必要があります。

于 2011-07-26T18:52:39.237 に答える