Django迁移PostgreSQL连接失败,DATABASES配置错误求助
Django迁移时PostgreSQL连接错误排查方案
报错信息
Unable to connect to PostgreSQL: Traceback (most recent call last): File "manage.py", line 22, in <module> main() File "manage.py", line 18, in main execute_from_command_line(sys.argv) File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line utility.execute() File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\core\management\__init__.py", line 436, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\core\management\base.py", line 412, in run_from_argv self.execute(*args, **cmd_options) File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\core\management\base.py", line 458, in execute output = self.handle(*args, **options) File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\core\management\base.py", line 106, in wrapper res = handle_func(*args, **kwargs) File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\core\management\commands\migrate.py", line 117, in handle executor = MigrationExecutor(connection, self.migration_progress_callback) File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__ self.loader = MigrationLoader(self.connection) File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\db\migrations\loader.py", line 58, in __init__ self.build_graph() File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\db\migrations\loader.py", line 235, in build_graph self.applied_migrations = recorder.applied_migrations() File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\db\migrations\recorder.py", line 81, in applied_migrations if self.has_table(): File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\db\migrations\recorder.py", line 57, in has_table with self.connection.cursor() as cursor: File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\db\backends\base\base.py", line 330, in cursor return self._cursor() File "C:\python\SkillFactory\Sprint\env\lib\site-packages\django\db\backends\dummy\base.py", line 20, in complain raise ImproperlyConfigured( django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
当前settings.py配置片段
load_dotenv() print("Database Name:", os.getenv('FSTR_DB_NAME')) print("Database User:", os.getenv('FSTR_DB_USER')) print("Database Password:", os.getenv('FSTR_DB_PASSWORD')) print("Database Host:", os.getenv('FSTR_DB_HOST')) print("Database Port:", os.getenv('FSTR_DB_PORT')) BASE_DIR = Path(__file__).resolve().parent.parent # Настройки базы данных DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('FSTR_DB_NAME'), 'USER': os.getenv('FSTR_DB_USER'), 'PASSWORD': os.getenv('FSTR_DB_PASSWORD'), 'HOST': os.getenv('FSTR_DB_HOST'), 'PORT': os.getenv('FSTR_DB_PORT'), } }
问题解决方案
1. 修正.env文件加载路径
load_dotenv()默认读取当前工作目录的.env文件,需先定义BASE_DIR再指定加载路径,避免路径错误:
import os from pathlib import Path from dotenv import load_dotenv # 先定义项目根目录 BASE_DIR = Path(__file__).resolve().parent.parent # 明确加载项目根目录下的.env文件 load_dotenv(BASE_DIR / '.env')
2. 验证环境变量是否加载成功
运行python manage.py runserver或python manage.py shell,查看控制台输出的print语句结果:
- 若输出
None,说明.env未正确加载,检查:- .env文件是否在项目根目录(与manage.py同级)
- .env文件名是否正确(注意是
.env,前缀有个点) - .env内的变量名是否和
os.getenv()的参数完全一致(大小写敏感)
3. 规范.env文件格式
.env文件需采用KEY=VALUE格式,不要加引号,示例:
FSTR_DB_NAME=你的数据库名 FSTR_DB_USER=你的数据库用户名 FSTR_DB_PASSWORD=你的数据库密码 FSTR_DB_HOST=localhost # 或127.0.0.1 FSTR_DB_PORT=5432 # PostgreSQL默认端口
4. 确保PostgreSQL驱动安装
Django连接PostgreSQL需要psycopg2或psycopg2-binary,执行安装命令:
pip install psycopg2-binary
环境变量配置基础步骤
- 在项目根目录(和manage.py同级)创建
.env文件 - 按
KEY=VALUE格式写入数据库连接信息,注意变量名和settings.py中os.getenv()的参数一致 - 在settings.py中先导入
load_dotenv,定义BASE_DIR后加载.env文件 - 运行
python manage.py shell测试变量加载:import os print(os.getenv('FSTR_DB_NAME')) # 应输出你的数据库名
内容的提问来源于stack exchange,提问作者user532577
相关产品推荐
相关产品推荐

