3

私はDjango 1.8(pytestを使用)を使用しており、次の構成を持っています:

  • およびによって管理されるデータベースdefaultで、読み取り操作か書き込み操作かに応じて、DB 呼び出しをいずれかの接続に転送します。readonlyMasterSlaveRouter
  • 私の開発環境では、settings.DATABASESディクショナリの両方のエントリが同じ設定になっています (異なる接続を使用しているだけですが、データベースは同じです)。
  • defaultただし、私のテスト環境にはデータベースしかありません。
  • モデルが保存さpost_saveれるたびにシグナルが発生します。Foo
  • インスタンス@transaction.atomicを変更して 2 回呼び出すアトミック操作 ( で装飾) があります。デコレータにはカスタムパラメータが渡されないため、トランザクションはデータベース上でのみアクティブになります。Foo.save()usingdefault

post_saveコールバックは を指すBarレコードを作成しますが、これを含むレコードが既に存在するかどうかを確認した後でのみです( を避けるため)。このチェックは、次のクエリを実行することによって行われます。OneToOneFieldFooBarfoo_idIntegrityError

already_exists = Bar.filter(foo=instance).exists()

post_saveこれは、コールバックが初めて呼び出されたときに問題ありません。Barレコードが作成され、すべて正常に動作します。ただし、2 回目は、そのようなBarインスタンスが前回のFoo保存で作成されたばかりであっても、フィルタリングは読み取り操作であるため、readonly接続を使用して実行already_existsされ、結果として値が含まれてしまいFalse、新しいレコードの作成がトリガーされます。これは最終的に IntegrityError をスローします。これは、作成操作がdefault接続で実行されると、そのfoo_id.

DATABASESディクショナリを dev_settings から test_settings にコピーしようとしましたが、これにより多くのテストが失敗しました。次に、デコレータについて読んoverride_settingsで、自分の状況にぴったりだと思いました。しかし、驚いたことに、うまくいきませんでした。ある時点で、アプリケーションが開始されると、DATABASES辞書 ( defaulttest_settings からのみのもの) がキャッシュされ、変更setting.DATABASESしても新しい値にアクセスできなくなります。

特定のテストのデータベース構成を適切にオーバーライドするにはどうすればよいですか?

4

1 に答える 1