Django:如何在Django测试套件中使用只读数据库

3
在我的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},
}

没有人能帮我吗?:/ - ThalusA
1个回答

0

在测试中,您可以选择任何想要的数据库。

在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']

第一个例子启动速度快。第二个可以帮助您更好地进行测试。


你想要我创建一个带有写权限的外部数据库副本吗?因为这样做,我也想测试一下外部数据库模型,这意味着每次我想运行测试时,我都希望有一个给定时间的完全一样的副本。由于外部数据库非常庞大,我不确定这是否是最佳实践,因为加载所有内容只是为了访问只读数据可能需要超过30分钟的时间。 - ThalusA
为了测试某些东西,您不需要最新的数据库。您应该运行测试。我给您写了第二种可能性:您可以使用其他数据库来编写。 - Maxim Danilov
对于这个例子,我需要最新的外部数据库。如果最新的外部数据库与它的快照不同,则测试应该失败。这是必须的,不是数据差异方面的,而是主要指模型差异,因为我需要有模型的一致性。顺便说一句,我并不真正理解你对我所说的话。你完全明白我的问题吗? - ThalusA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接