私は、Djangoの1.8(使用pytest)上だと私は、次の構成を有する:Djangoテストでデータベース設定をオーバーライドする方法は?
default
とDBは、彼らは「かどうかに応じて、1つの接続、または他の呼び出し指示MasterSlaveRouter
によって管理readonly
データベース再読み取りまたは書き込み操作。- 私の開発環境では、
settings.DATABASES
辞書の両方のエントリが同じ設定を持っています(別の接続を使用しますが、データベースは同じです)。 - 私のテスト環境では、
default
データベースしかありません。 - モデル
Foo
が保存されるたびに私はpost_save
シグナルを発しました。 Foo
インスタンスを変更し、.save()
を2回呼び出すアトミック操作(@transaction.atomic
で装飾)があります。using
カスタムパラメータはデコレータに渡されないので、トランザクションはdefault
データベースでのみ有効です。
post_save
コールバックはFoo
へOneToOneField
ポインティングとBar
レコードを作成しますが、これだけfoo_id
とBar
レコードがすでに(IntegrityError
を避けるために)存在するかどうかを確認した後。このチェックは、このクエリを実行することによって行われます。
already_exists = Bar.filter(foo=instance).exists()
これはpost_save
コールバックが呼び出される初めてokです。 Bar
レコードが作成され、すべて正常に動作します。ただし、このようなBar
インスタンスは、前のFoo
セーブで作成されたにもかかわらず、フィルタリングは読み取り操作であるため、接続を使用して実行されるため、False
の値を含むalready_exists
が終了し、 default
接続で作成操作を実行すると、既にfoo_id
のレコードが存在するため、新しいレコードがトリガされ、IntegrityErrorがスローされます。
私はDATABASES
辞書をdev_settingsからtest_settingsにコピーしようとしましたが、これは多くのテストを壊しました。私はその後、override_settings
デコレータについて読んで、それが私の状況にとって完璧だと思った。しかし、私の驚いたことに、それはうまくいかなかった。ある時点で、アプリケーションが開始されるときに、DATABASES
辞書(test_settingsのdefault
のみのもの)がキャッシュされ、setting.DATABASES
を変更しても、新しい値は単にアクセスされないようです。
1つの特定のテストのデータベース構成を正しく上書きするにはどうすればよいですか?