Django运行测试套件时如何配置只读外部数据库不创建测试库
配置调整步骤
1. 补全外部只读数据库的TEST配置
你现有配置缺少禁止建库的核心参数,先调整DATABASES["aact"]配置如下:
DATABASES["aact"] = { # 旧引擎名postgresql_psycopg2已废弃,替换为官方新路径 "ENGINE": "django.db.backends.postgresql", "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, # 核心参数:禁止测试框架创建、销毁该数据库 "CREATE_DB": False, # 关闭测试事务序列化,只读库不需要测试后回滚数据 "SERIALIZE": False, # 跳过字符集、排序规则检查,避免触发额外初始化查询 "COLLATION": None, "CHARSET": None, }, }
CREATE_DB: False是Django 3.2+新增的测试配置项,设置后测试运行时不会执行建库、删库逻辑,直接使用NAME指定的已有数据库连接。- 关闭
SERIALIZE可以避免Django为了回滚测试数据,在内存中序列化该库的模型数据,减少不必要的开销。
2. 解决连接postgres默认库的运行时警告
这个警告的触发原因是:Django PostgreSQL后端默认会在测试初始化阶段连接postgres系统库,避免直接对目标库执行初始化检查。你没有该系统库权限,且不需要框架做建库检查,可通过自定义轻量数据库后端跳过该逻辑:
- 在项目目录下新建数据库后端文件,路径示例:
your_project/db_backends/postgresql/base.py,写入以下代码:
from django.db.backends.postgresql.base import DatabaseWrapper as BasePostgresWrapper class DatabaseWrapper(BasePostgresWrapper): def get_connection_params(self): conn_params = super().get_connection_params() # 对配置了CREATE_DB=False的库,强制连接指定的业务库,不切换到postgres系统库 if self.settings_dict["TEST"].get("CREATE_DB") is False: conn_params["database"] = self.settings_dict["NAME"] return conn_params
- 将
DATABASES["aact"]的ENGINE配置替换为自定义后端的路径,示例:
"ENGINE": "your_project.db_backends.postgresql",
替换后测试运行时不会再尝试连接postgres系统库,对应警告会直接消失。
3. 额外校验项
- 确认你的数据库路由配置正确,两个库的模型没有交叉关联,测试时所有aact库的模型操作都会路由到aact连接。
- 测试用例中禁止对aact库的模型执行
save()、delete()、update()等写操作,避免触发只读库权限报错。
内容的提问来源于stack exchange,提问作者ThalusA
相关产品推荐
相关产品推荐

