Django внешнее соединение MySQL DB в тесте жалуется "неизвестная база данных" - PullRequest
0 голосов
/ 15 января 2019

В моем проекте django у меня есть несколько соединений с базой данных:

например.

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "NAME": "awesome",
        ...
    },
    "other_1": {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "NAME": "other_1",
        "TEST": {"MIRROR": default}
        ...
    },
    "other_2": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "other_2",
        "TEST": {"MIRROR": default}
    }
}

Примечание:

  1. default и other_1 оба являются postgres бэкэндами и other_2 - это mysql бэкэнд.
  2. Я добавил "TEST": {"MIRROR": default} к дополнительной конфигурации базы данных, чтобы избежать создания этих баз данных во время тестирования. Смотрите эту ссылку .

Проблема:

Когда я запускаю тест, он жалуется на Unknown database 'test_awesome', трассировка стека показывает, что он из бэкэнда MYSQL:

Traceback (most recent call last):
  File "/Users/jlin/virtualenvs/awesome-1SH6mAZ2/lib/python3.6/site-packages/django/test/testcases.py", line 1005, in setUpClass
    if not connections_support_transactions():
  File "/Users/jlin/virtualenvs/awesome-1SH6mAZ2/lib/python3.6/site-packages/django/test/testcases.py", line 970, in connections_support_transactions
...
File "/Users/jlin/virtualenvs/awesome-1SH6mAZ2/lib/python3.6/site-packages/MySQLdb/__init__.py", line 85, in Connect
    return Connection(*args, **kwargs)
  File "/Users/jlin/virtualenvs/awesome-1SH6mAZ2/lib/python3.6/site-packages/MySQLdb/connections.py", line 204, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
django.db.utils.OperationalError: (1049, "Unknown database 'test_awesome'")

Если я закомментирую соединение other_2, тест выполнится нормально.

1 Ответ

0 голосов
/ 30 января 2019

Похоже, проблема в том, что бэкэнд есть?

Я копался в setup_database коде , и если я удаляю other_2 в mirrored_aliases dict, тогда мой тестовый код работает нормально.

Итак, я создал класс тестового прогона, чтобы удалить соединение other_2, потому что оно слишком глубоко в коде, чтобы удалить его из mirriored_aliases.

class TestRunner(DiscoverRunner):
    def setup_databases(self, **kwargs):
        # to get around this problem
        # /10522580/django-vneshnee-soedinenie-mysql-db-v-teste-zhaluetsya-neizvestnaya-baza-dannyh
        settings.DATABASES.pop('other_2', None)
        return super(TestRunner, self).setup_databases(**kwargs)
...