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']
Первый пример поможет быстро начать. Второй поможет вам сделать тесты лучше.