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数据库引擎,从而触发配置错误。
修复步骤
统一环境变量名称
选择修改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") #数据库主机修正.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>'确保.env文件被正确加载
安装python-dotenv包:pip install python-dotenv在manage.py文件开头添加加载代码:
from dotenv import load_dotenv load_dotenv()验证配置
运行命令进入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
相关产品推荐
相关产品推荐

