Django Shell写入记录至错误数据库问题排查
问题排查方向
1. 环境变量优先级冲突
非测试项目从~/.bash_profile加载的数据库连接变量(比如DB_HOST、DB_NAME等)属于系统级环境变量,优先级高于测试项目.env文件里的同名变量。当你启动测试项目的Django Shell时,当前shell会话已经加载了~/.bash_profile的变量,Django会优先读取系统级环境变量,而非.env里的测试库配置,最终导致记录写入非测试库。
2. .env文件未被正确加载
- 测试项目的
settings.py可能未配置python-dotenv加载.env文件,或者加载路径错误(比如.env不在项目根目录,加载代码写在了读取环境变量的逻辑之后)。 - 检查
settings.py开头是否有正确的加载代码:from dotenv import load_dotenv import os load_dotenv() # 必须在读取数据库配置前执行 - 同时确认
.env文件对当前用户有可读权限,权限不足会导致无法读取配置。
3. 数据库配置变量名错误
测试项目settings.py里的数据库配置可能误用了非测试项目的变量名,或者变量名拼写错误,导致读取到~/.bash_profile里的非测试库配置。比如:
# 错误示例:误用了生产环境变量名 DATABASES = { 'default': { 'ENGINE': 'sql_server.pyodbc', 'NAME': os.getenv('PROD_DB_NAME'), # 应为TEST_DB_NAME 'HOST': os.getenv('PROD_DB_HOST'), # ...其他配置项 } }
4. Shell会话环境污染
如果之前在同一个shell会话中运行过非测试项目的命令,~/.bash_profile的变量已经被加载,即使切换到测试项目,这些变量依然存在。此时需要重启shell会话,或者手动清空相关环境变量后再启动测试项目的Django Shell。
5. 虚拟环境冲突
如果测试项目和非测试项目共用虚拟环境,或者启动测试项目Shell时激活了非测试项目的虚拟环境,会导致环境变量混淆。确保启动测试项目Shell前,激活的是测试项目对应的虚拟环境。
内容的提问来源于stack exchange,提问作者Konstantinos
相关产品推荐
相关产品推荐

