Django: Использование базы данных, доступной только для чтения, в тестовом наборе django

В моем проекте Django я использую две базы данных, одна из которых является моей собственной базой данных PostgreSQL, где у меня есть права на чтение и запись, а другая - внешняя база данных PostgreSQL, в которой у меня есть только права только на чтение.

В контексте проекта это работает отлично, я могу получить доступ к обеим базам данных. Однако когда я использую тестовый пакет Django, используя ./manage.py test, Django пытается создать тестовую базу данных для внешней базы данных.

Я не хочу этого, я хочу иметь возможность доступа к внешней базе данных PostgreSQL внутри тестового пакета без необходимости создавать тестовую базу данных на этой внешней базе данных PostgreSQL.

Он также выдает мне эту ошибку:

/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py:323: RuntimeWarning:
Normally Django will use a connection to the 'postgres' database to avoid
running initialization queries against the production database when it's not needed
(for example, when running tests).
Django was unable to create a connection to the 'postgres' database
and will use the first PostgreSQL database instead.

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

Вот конфигурация для внешнего соединения с базой данных только для чтения:

DATABASES["aact"] = {
    "ENGINE": "django.db.backends.postgresql_psycopg2",
    "OPTIONS": {"options": "-c search_path=ctgov"},
    "NAME": AACT_DATABASE_NAME,
    "USER": AACT_DATABASE_USER,
    "PASSWORD": AACT_DATABASE_PASS,
    "HOST": AACT_DATABASE_HOST,
    "PORT": AACT_DATABASE_PORT,
    "TEST": {"NAME": AACT_DATABASE_NAME, "MIGRATE": False},
}

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

в settings.py, или, что гораздо лучше, local_settings.py:

import sys

DATABASES["aact"] = {...}
if 'test' in sys.argv:
   DATABASES["aact"] = {settings for fake database with write permissions}

Другой способ - определить свой DbRouter. https://docs.djangoproject.com/en/4.0/topics/db/multi-db/#database-routers

class BaseRouter:
    
    def db_for_read(self, model, **__):
        return "db for read"

    def db_for_write(self, model, **__):
        return "db for write"

после этого в settings.py:

DATABASE_ROUTERS = ['somethere.whereis.BaseRouter']

Первый пример поможет быстро начать. Второй поможет вам сделать тесты лучше.

Вернуться на верх