私はDjango 1.3.1を使用しています。私は2つのデータベースを持っており、私のモデルのいくつかは1つのデータベースに存在し、いくつかは他のデータベースに存在します。どちらのデータベースもcontrib.gis.db.backends.postgisデータベースです。Django TestCaseはセカンダリデータベースでトランザクションを使用していません
私の驚いたことに、DjangoのTestCaseは、テスト間で2次データベースで行った変更をロールバックしていません。
次のコードでは、myproject.models.WellOwnerは基本的にフィールド "name"のみを持つ非常に単純なモデルです。ルータはセカンダリデータベースにあるはずだと言います。最初のテストでアサーションは、第二のテストは失敗し、成功します
from django.test import TestCase
from myproject.models import WellOwner
class SimpleTest(TestCase):
def test1(self):
WellOwner.objects.create(name="Remco")
self.assertEquals(1, WellOwner.objects.count()) # Succeeds
class SimpleTest2(TestCase):
def test2(self):
# I would expect to have an empty database at this point
self.assertEquals(0, WellOwner.objects.count()) # Fails!
私はDjangoはなく、セカンダリデータベースに、デフォルトのデータベース上のトランザクションでこれをラップしていることを前提としています。これは既知の問題ですか?修正はありますか?おそらく1.4では?私のGoogle-fuは失敗しています。
(すべてが同じデータベースに入るように、私は設定で[]にDATABASE_ROUTERSを変更した場合、問題が消える)私はそれが助け場合は、ルータの全体のコードを追加します:
SECONDARY_MODELS = ('WellOwner', ...)
import logging
logger = logging.getLogger(__name__)
class GmdbRouter(object):
"""Keep some models in a secondary database."""
def db_for_read(self, model, **hints):
if model._meta.app_label == 'gmdb':
if model._meta.object_name in SECONDARY_MODELS:
return 'secondary'
return None
def db_for_write(self, model, **hints):
# Same criteria as for reading
return self.db_for_read(model, **hints)
def allow_syncdb(self, db, model):
if db == 'secondary':
if model._meta.app_label in ('sites', 'south'):
# Hack for bug https://code.djangoproject.com/ticket/16353
# When testing, create django_site and south in both databases
return True
return self.db_for_read(model) == 'secondary'
else:
# Some other db
if model._meta.app_label == 'gmdb':
# Our models go in the other db if they don't go into secondary
return self.db_for_read(model) != 'secondary'
# Some other model in some other db, no opinion
return None
あなたが含まれている必要があり、あなたの問題のルータ。それが問題の原因となります。 –
私はモデルを別のデータベースに移動すると、 'integrityerror'の' connection._rollback() '修正がもう機能しなくなったのと同じような場合があります。またpostgisモデルなので、 'django.contrib.gis.db.models'に何か間違っているかもしれません – RickyA
ちょっとRemcoGerlich、決して解決策を見つけましたか?私は同じ問題で苦労しているhttp://stackoverflow.com/questions/12205855/factory-boy-instance-within-testcase-causes-unique-contraint-violation –