直接修改 databases 字典无效,因 django 连接池、缓存及路由均基于启动时配置快照,运行时赋值不触发连接重建,新配置被忽略;须配合 connections.close_all() 强制重建或改用 databasewrapper 临时连接。

为什么不能直接改 DATABASES 字典?
运行时直接赋值 DATABASES['default'] = {...} 看似可行,但 Django 的数据库连接池、连接缓存、路由逻辑(如 db_for_read)都基于启动时解析的配置快照。后续修改不会触发连接重建,旧连接仍复用,新配置实际被忽略。
用 django.db.connections 切换连接实例
这是最稳妥的动态切换方式:不碰全局配置,而是按需创建并使用独立的 DatabaseWrapper 实例。适用于临时查某个外部库、多租户分库等场景。
实操建议:
- 用
django.db.utils.ConnectionHandler手动构造连接:from django.db import utils from django.db.backends.postgresql.base import DatabaseWrapper config = { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydb', 'USER': 'user', 'PASSWORD': 'pass', 'HOST': '10.0.1.5', 'PORT': '5432', } conn = DatabaseWrapper(config, alias='temp') with conn.cursor() as c: c.execute("SELECT 1") - 注意手动管理连接生命周期——用完调
conn.close(),否则可能泄漏连接 - 不支持 Django ORM 的
.filter()等高级操作,只能走原生 SQL 或自行封装 QuerySet
重载 settings.DATABASES 后必须重置连接池
如果硬要改全局配置(例如切换整个站点的主库),光改字典不够,得清空已建立的连接缓存。
关键步骤:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 先修改
settings.DATABASES['default']字典内容 - 立刻执行
from django.db import connections; connections.close_all()—— 这会强制下次connections['default']访问时重建连接 - 注意:所有线程共享这个连接池,多线程下可能有竞态;生产环境慎用
- 某些第三方库(如
django-compressor)可能在初始化阶段就访问了 DB,此时重载已晚
多租户场景下推荐用数据库路由 + 动态 alias
真正需要频繁切换库时,别在运行时改配置,而应提前定义多个 alias(如 'tenant_a', 'tenant_b'),再配合自定义 DatabaseRouter 和请求上下文决定用哪个。
要点:
- 在
settings.DATABASES中预设全部可能的库配置,alias 名用租户 ID 命名 - 路由类中重写
db_for_read/db_for_write,从threading.local()或请求中间件注入的 tenant ID 取 alias - ORM 操作自动路由,无需手动指定
using=...,也避免连接状态混乱
这种模式把“动态”转移到配置层和路由逻辑,比运行时改字典更可控,也更容易测试。
动态改连接最易被忽略的是连接复用与事务边界——哪怕配置换了,正在执行的事务仍绑定旧连接,强行切换可能导致数据写到错误库或事务中断。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










