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

Django执行migrate/runserver报错:settings.DATABASES缺失ENGINE配置

数据库配置错误导致Django无法启动及迁移问题

无法迁移代码变更,执行python manage.py runserver命令时触发报错,完整报错栈如下:

Traceback (most recent call last):
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\manage.py", line 22, in 
main()
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\core\management\__init__.py", line 442, in
execute_from_command_line
utility.execute()
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\core\management\__init__.py", line 436, in
execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\core\management\base.py", line 413, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\core\management\base.py", line 459, in execute
output = self.handle(*args, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\core\management\base.py", line 107, in wrapper
res = handle_func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\core\management\commands\migrate.py", line
117, in handle
executor = MigrationExecutor(connection, self.migration_progress_callback)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
self.loader = MigrationLoader(self.connection)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\db\migrations\loader.py", line 58, in __init__
self.build_graph()
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\db\migrations\loader.py", line 235, in build_graph
self.applied_migrations = recorder.applied_migrations()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\db\migrations\recorder.py", line 89, in applied_migrations
if self.has_table():
^^^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\db\migrations\recorder.py", line 63, in has_table
with self.connection.cursor() as cursor:
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\db\backends\base\base.py", line 316, in cursor
return self._cursor()
^^^^^^^^^^^^^^
File "C:\Users\kshitijb\Desktop\Income-Expense-Tracker\env\Lib\site-packages\django\db\backends\dummy\base.py", line 20, in complain
raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: settings.DATABASES配置不正确,请提供ENGINE值。更多详情请查看settings文档。

当前配置

settings.py相关代码

DB_NAME = os.environ.get("POSTGRES_DB") #数据库名称
DB_USER_PASSWORD = os.environ.get("POSTGRES_PASSWORD") #数据库用户密码
DB_USER = os.environ.get("POSTGRES_USER") #数据库用户名
DB_HOST = os.environ.get("POSTGRES_HOST") #数据库主机
# POSTGRES_PORT = os.environ.get("POSTGRES_PORT") #数据库端口


POSTGRES_READY = (
    DB_NAME is not None
    and DB_USER_PASSWORD is not None
    and DB_USER is not None
    and DB_HOST is not None
)

print(POSTGRES_READY)

if POSTGRES_READY:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': DB_NAME,
            'USER': DB_USER,
            'PASSWORD': DB_USER_PASSWORD,
            'HOST': DB_HOST,
        }
    }

.env文件内容

export DB_NAME=<DB_NAME>
export DB_USER=<DB_USER>
export DB_USER_PASSWORD=<DB_USER_PASSWORD>
export DB_HOST=localhost

export CLOUD_NAME=<CLOUDINARY_CLOUD_NAME>
export API_KEY=<CLOUDINARY_API_KEY>
export API_SECRET=<CLOUDINARY_API_SECRET>
export SECRET_KEY=<CLOUDINARY_SECRET_KEY>
export SENTRY_DSN='<SENTRY_DSN_URL>'

问题原因及解决方法

核心问题

settings.py中读取的环境变量名称与.env里定义的完全不匹配:

  • settings.py用POSTGRES_DB,但.env里是DB_NAME
  • settings.py用POSTGRES_PASSWORD,但.env里是DB_USER_PASSWORD
  • settings.py用POSTGRES_USER,但.env里是DB_USER
  • settings.py用POSTGRES_HOST,但.env里是DB_HOST

这导致所有环境变量读取结果为None,POSTGRES_READY为False,DATABASES未被赋值,Django默认使用dummy数据库引擎,从而触发配置错误。

修复步骤

  1. 统一环境变量名称
    选择修改settings.py匹配.env的变量名,修改后的代码如下:

    DB_NAME = os.environ.get("DB_NAME") #数据库名称
    DB_USER_PASSWORD = os.environ.get("DB_USER_PASSWORD") #数据库用户密码
    DB_USER = os.environ.get("DB_USER") #数据库用户名
    DB_HOST = os.environ.get("DB_HOST") #数据库主机
    
  2. 修正.env文件格式(Windows环境)
    Windows的cmd/powershell不支持export命令,需去掉所有export前缀,改为纯键值对格式:

    DB_NAME=<DB_NAME>
    DB_USER=<DB_USER>
    DB_USER_PASSWORD=<DB_USER_PASSWORD>
    DB_HOST=localhost
    
    CLOUD_NAME=<CLOUDINARY_CLOUD_NAME>
    API_KEY=<CLOUDINARY_API_KEY>
    API_SECRET=<CLOUDINARY_API_SECRET>
    SECRET_KEY=<CLOUDINARY_SECRET_KEY>
    SENTRY_DSN='<SENTRY_DSN_URL>'
    
  3. 确保.env文件被正确加载
    安装python-dotenv包:

    pip install python-dotenv
    

    在manage.py文件开头添加加载代码:

    from dotenv import load_dotenv
    load_dotenv()
    
  4. 验证配置
    运行命令进入Django shell:

    python manage.py shell
    

    输入以下代码检查环境变量是否正确读取:

    import os
    print(os.environ.get("DB_NAME"))
    print(os.environ.get("DB_USER"))
    print(os.environ.get("DB_USER_PASSWORD"))
    print(os.environ.get("DB_HOST"))
    

    同时检查POSTGRES_READY的值是否为True。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:36:11