You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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系统库,避免直接对目标库执行初始化检查。你没有该系统库权限,且不需要框架做建库检查,可通过自定义轻量数据库后端跳过该逻辑:

  1. 在项目目录下新建数据库后端文件,路径示例: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
  1. 将DATABASES["aact"]的ENGINE配置替换为自定义后端的路径,示例:
"ENGINE": "your_project.db_backends.postgresql",

替换后测试运行时不会再尝试连接postgres系统库,对应警告会直接消失。

3. 额外校验项

  • 确认你的数据库路由配置正确,两个库的模型没有交叉关联,测试时所有aact库的模型操作都会路由到aact连接。
  • 测试用例中禁止对aact库的模型执行save()、delete()、update()等写操作,避免触发只读库权限报错。

内容的提问来源于stack exchange,提问作者ThalusA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:24:22