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

使用.env文件时Django数据库配置异常,执行migrate报错

Django读取.env配置数据库时migrate报错:未提供ENGINE值

执行migrate操作时触发以下错误:

django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.

使用.env文件配置数据库参数时出现上述问题,但将参数硬编码到settings.py后,migrate可正常执行。

当前settings.py数据库配置

DATABASES = {
    'default': {
        'ENGINE': os.environ.get('DB_ENGINE'),
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASSWORD'),
        'HOST': os.environ.get('DB_HOST'),
        'PORT': os.environ.get('DB_PORT'),
    }
}

.env文件内容

# DB
DB_ENGINE=django.db.backends.postgresql
DB_NAME=db
DB_USER=user
DB_PASSWORD=password
DB_HOST=127.0.0.1
DB_PORT=5432

PyCharm的.env设置

PyCharm .env配置界面

可正常运行的硬编码配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'db',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

问题排查与解决方法

  1. 确保.env文件被正确加载
    若使用python-dotenv管理环境变量,必须在settings.py开头添加加载代码:

    from dotenv import load_dotenv
    import os
    
    load_dotenv()  # 加载项目根目录下的.env文件
    

    没有这段代码的话,os.environ.get()无法读取.env中的变量,会返回None,导致ENGINE参数缺失。

  2. 验证PyCharm运行配置
    检查Run/Debug Configurations中,当前运行migrate的配置是否勾选了"Load environment variables from file",并指定了正确的.env文件路径。即使全局配置了.env,个别运行配置可能未启用该选项。

  3. 确认变量读取状态
    在settings.py中临时添加打印语句,验证变量是否读取成功:

    print("DB_ENGINE:", os.environ.get('DB_ENGINE'))
    

    执行migrate前查看控制台输出,若显示None,说明变量未被正确加载。

  4. 添加默认值兜底
    为避免变量读取失败直接报错,可给os.environ.get()设置默认值:

    'ENGINE': os.environ.get('DB_ENGINE', 'django.db.backends.postgresql'),
    

    这样即使变量未加载,也能保证配置有默认值,方便后续排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:20:38