Объект Django connections не видит таблицы второй базы данных во время тестирования с помощью pytest-django

Итог: мой объект django connections не видит табличных отношений второй базы данных во время тестирования с pytest-django.

описание: У меня проблема, когда мой объект django connections, похоже, получает неправильную информацию о базе данных. Я наткнулся на эту проблему, когда я запрашивал таблицу в БД "клиенты", и Джанго сказал мне, что отношения не существует. В разделе База данных settings.py был создан как ниже:

DATABASES = {
    'default': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.postgres',
        'USER': 'postgres_1',
        'PASSWORD': 'superS3cret'
    },
    'customers': {
        'NAME': 'customer_data',
        'ENGINE': 'django.db.backends.postgres',
        'USER': 'postgres_1',
        'PASSWORD': 'superS3cret'
    }
}

оба курсора ниже получают информацию из базы данных "по умолчанию", когда я запускаю "pytest" в каталоге с:

sql = """SELECT table_name FROM information_schema.tables WHERE table_nameschema='public'"""

default = connections["default"].cursor()
default.execute(sql)
raw_data = default.fetchall()
sql_columns = [col[0] for col in default.description]
df1 = pd.DataFrame(raw_data, columns=sql_columns)

customers = connections["customers"].cursor()
customers.execute(sql)
raw_data = customers.fetchall()
sql_columns = [col[0] for col in customers.description]
df2 = pd.DataFrame(raw_data, columns=sql_columns)

результаты df1 и df2 точно такие же: только имена таблиц в базе данных "по умолчанию".

это происходит с pytest-django и с использованием второй базы данных Postgres,но только иногда.

в запросе выше я ожидал бы, что df1 и df2 будут разными, до сих пор поскольку базы данных "по умолчанию" и "клиенты" различны. Однако Иногда курсор соединений неправильно "видит" всю информацию во второй базе данных.

странно то, что настройки подключения отображаются по-разному, когда я печатаю:

print(connections.databases)

объект 'connections' содержит два разных DBs, но один из них является" тестовым " DB. Оператор print дает словарь, но обратите внимание на "test_customers":

(pdb) { 'default': { <conn info>}, 'test_customers': { <conn info> } }

кажется, хотя Django пытается настроить тестовую базу данных, терпит неудачу и не проходит тесты, потому что таблицы в "test_customers" не существуют так же, как в производстве.

как это исправить, чтобы pytest-django всегда видел таблицы во второй базе данных (клиенты) во время тестирования? Я делаю что-то не так с настройкой и демонтажем БД?

обновление на pytest-django docs о создании/повторном использовании БД указал мне на правильное направление. Тем не менее, я немного обеспокоен этим разделом документов:

В настоящее время pytest-django специально не поддерживает Django поддержка нескольких баз данных. Однако вы можете использовать обычный Django TestCase экземпляры для использования поддержки multi_db.

если у вас есть идеи о лучшем API для поддержки нескольких баз данных непосредственно в pytest-django, пожалуйста, свяжитесь с нами, мы заинтересованы в в конце концов, поддерживая это, но неуверенный в просто после Джанго подход.

1 ответов


pytest-django не поддерживает несколько баз данных. Когда я экспериментировал с несколькими базами данных и параметров --reuse-db/--create-db результатом является то, что иногда он работает (все базы данных создаются и могут использоваться правильно), а иногда он не работает (либо база данных не создается, либо Django жалуется, что база данных уже существует).

IMHO есть два варианта:1) не использовать pytest с Django; 2) упростите тесты, чтобы вам не требовалось несколько баз данных. Для варианта 2) я использую эту установку:

нормальный settings:

DATABASES = {
    'default': ...,
    'secondary': ...,
}

pytest.ini:

[pytest]
...
DJANGO_SETTINGS_MODULE=my_app.settings.test
...

test.py:

# Import all from normal settings
from .base import *

DATABASES.pop('secondary')
# This will route all queries and migrations to the default DB
DATABASE_ROUTERS = []