Django TestCase не использует транзакции на вторичной базе данных

Я использую Django 1.3.1. У меня есть две базы данных, некоторые из моих моделей живут в одной базе данных, некоторые в другой. Обе базы данных являются базами данных contrib.gis.db.backends.postgis.

К моему удивлению, TestCase от Django не откатывает изменения, которые я сделал во вторичной базе данных между тестами.

В следующем коде myproject.models.WellOwner представляет собой очень простую модель, которая в основном имеет только поле «имя». Маршрутизатор говорит, что он должен быть во вторичной базе данных. Утверждение в первом тесте успешно, второй тест не пройден:

<code>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!
</code>

Я предполагаю, что Django включает это в транзакцию в базе данных по умолчанию, но не во вторичной базе данных. Это известная проблема? Есть ли исправление? В 1.4 возможно? Мой Google-фу не работает.

(если я изменю DATABASE_ROUTERS на [] в настройках, чтобы все входило в одну базу данных, проблема исчезнет)

Я добавлю весь код маршрутизатора на случай, если это поможет:

<code>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
</code>
 Bayard Randel05 сент. 2012 г., 01:48
эй RemcoGerlich, вы когда-нибудь находили решение? Я борюсь с той же проблемойstackoverflow.com/questions/12205855/…
 Lakshman Prasad12 апр. 2012 г., 13:31
Вы должны включить свои маршрутизаторы в вопрос. Вот где проблема может быть.
 RickyA09 авг. 2012 г., 10:26
У меня есть похожий случай, когдаconnection._rollback() исправить дляintegrityerror больше не работает, как только я перенесу модель в отдельную базу данных. Также модели postgis, так что, возможно, что-то не так вdjango.contrib.gis.db.models

Ответы на вопрос(1)

Попробуй это:

class MyTestCase(TestCase):
    multi_db = True

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

Ваш ответ на вопрос