8

Django 1.3.1 を使用しています。私は 2 つのデータベースを持っています。私のモデルのいくつかは 1 つのデータベースにあり、いくつかは別のデータベースにあります。どちらのデータベースも contrib.gis.db.backends.postgis データベースです。

驚いたことに、Django の TestCase は、テスト間でセカンダリ データベースに加えた変更をロールバックしません。

次のコードの myproject.models.WellOwner は、基本的にフィールド「name」のみを持つ非常に単純なモデルです。ルーターは、セカンダリ データベースにある必要があると言います。最初のテストのアサーションは成功し、2 番目のテストは失敗します。

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
4

2 に答える 2

6

これを試して:

class MyTestCase(TestCase):
    multi_db = True

https://docs.djangoproject.com/en/1.2/topics/testing/#django.test.TestCase.multi_db

于 2012-09-05T21:25:45.283 に答える