модульное тестирование Django на нескольких базах - PullRequest
5 голосов
/ 12 ноября 2010

Я работаю над проектом django, где все мои тестовые примеры работали отлично.

Задница, как только я ввел вторую базу данных, все мои тестовые случаи, наследуемые от TestCase, не работают.На данном этапе у меня нет тестового примера для этой второй базы данных, но мой маршрутизатор работает нормально.

Когда я запускаю тесты, я получаю сообщение об ошибке,

"KeyError: 'SUPPORTS_TRANSACTIONS'"

Мне кажется, что он пытается проверить, что все базы данных, которые у меня есть, поддерживают транзакции, но вторая база данных никогда не создается.

Любые идеи о том, как получитьтестовый скрипт для построения второй базы данных.

Ответы [ 4 ]

4 голосов
/ 18 сентября 2016

Я понимаю, что это довольно старый поток, но я столкнулся с ним с той же проблемой, и я решил добавить флаг multi_db = True в мой тестовый пример, например:

class TestThingWithMultipleDatabases(TestCase):
     multi_db = True

     def test_thing(self):
         pass

Источник https://github.com/django/django/blob/master/django/test/testcases.py#L861

Это заставляет django вызывать flush для всех баз данных (или выполнять откат, если они поддерживают транзакции)

Я тоже использую дб роутер

Боюсь, я не могу найти это в документации Django, поэтому нет ссылки для этого

3 голосов
/ 16 декабря 2010

да, у меня была похожая проблема ... я решил исправить 'SUPPORTS_TRANSACTIONS': True для каждого соединения с базой данных в файле настроек. Не уверен, что это правильный способ исправить это, но у меня это сработало.

0 голосов
/ 15 апреля 2011

Вот несколько настроек дБ, которые в настоящее время находятся в производстве:

DATABASES = {
    # 'default' is used as the WRITE (master) connection
    DB_PRIMARY_MASTER: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'main',
        'USER': 'main_write',
        'PASSWORD': 'XXXX',
        'HOST': 'db-master',
        'PORT': '3306',
        'SUPPORTS_TRANSACTIONS': True,
    },

    # Slave connections are READONLY
    DB_PRIMARY_SLAVE: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'main',
        'USER': 'main_read',
        'PASSWORD': 'XXXX',
        'HOST': 'db-slave',
        'PORT': '3306',
        'TEST_MIRROR': DB_PRIMARY_MASTER,
        'SUPPORTS_TRANSACTIONS': True,
    },

    # 'mail_default' is used as the WRITE (master) connection for the mail database
    DB_MAIL_MASTER: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbmail',
        'USER': 'dbmail_write',
        'PASSWORD': 'XXXX',
        'HOST': 'db-mail-master',
        'PORT': '3306',
        'SUPPORTS_TRANSACTIONS': True,
    },

    # Slave connections are READONLY
    DB_MAIL_SLAVE: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbmail',
        'USER': 'dbmail_read',
        'PASSWORD': 'XXXX',
        'HOST': 'db-mail-slave',
        'PORT': '3306',
        'TEST_MIRROR': DB_MAIL_MASTER,
        'SUPPORTS_TRANSACTIONS': True,
    },
}

DB_PRIMARY_MASTER, DB_PRIMARY_SLAVE, DB_MAIL_MASTER и DB_MAIL_SLAVE - все строковые константы, так что они могут использоваться в моем маршрутизаторе базы данных.
Подсказка: DB_PRIMARY_MASTER = 'default'

Надеюсь, это поможет!

0 голосов
/ 21 марта 2011

'SUPPORTS_TRANSACTIONS': True работал и для меня. Однако у меня есть какая-то странная установка нескольких дБ с использованием маршрутизаторов базы данных. @ user298404: как выглядит настройка нескольких дБ?

пс. извиняюсь; недостаточно комментариев для комментирования ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...