Django配置双数据库遇PostgreSQL版本兼容问题求助
Django多数据库配置与PostgreSQL版本不匹配问题解决
问题描述
我正尝试为Django项目配置两个数据库,分别用于开发环境与生产环境。我的settings.py配置如下:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } db_from_env = dj_database_url.config(conn_max_age=500) DATABASES["default"].update(db_from_env) export DATABASE_URL=path_to_database
启动服务器时出现错误:django.db.utils.NotSupportedError: PostgreSQL 12 or later is required (found 11.18)。但终端执行psql命令显示:psql (14.7 (Homebrew), server 15.2),且我的Mac未安装PostgreSQL@11,请问该如何解决?
问题根源
你看到的psql版本是客户端版本,错误提示的是实际连接的服务器端PostgreSQL版本为11.18——这说明环境变量DATABASE_URL指向的不是本地的15.2版本实例,而是远程或其他旧版本的PostgreSQL服务。
解决步骤
- 检查
DATABASE_URL实际值:在终端执行echo $DATABASE_URL,确认这个URL的地址、端口、数据库名是否正确,是否指向了旧版本的数据库实例。 - 修正
DATABASE_URL:如果要连接本地15.2版本的PostgreSQL,将环境变量设置为本地实例的连接串,示例:export DATABASE_URL=postgres://用户名:密码@localhost:5432/你的数据库名 - 拆分开发/生产环境的数据库配置:避免用单一
default数据库覆盖,直接在settings.py中分别配置两个库,通过环境变量切换默认库,示例:
终端切换环境的命令:import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent # 分别定义开发、生产数据库 DATABASES = { 'dev': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', }, 'prod': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('PROD_DB_NAME'), 'USER': os.getenv('PROD_DB_USER'), 'PASSWORD': os.getenv('PROD_DB_PASSWORD'), 'HOST': os.getenv('PROD_DB_HOST'), 'PORT': os.getenv('PROD_DB_PORT', '5432'), } } # 根据环境变量切换默认数据库 ENVIRONMENT = os.getenv('ENVIRONMENT', 'dev') DATABASES['default'] = DATABASES[ENVIRONMENT]# 启动开发环境 export ENVIRONMENT=dev # 启动生产环境 export ENVIRONMENT=prod export PROD_DB_NAME=生产库名 export PROD_DB_USER=生产库用户名 export PROD_DB_PASSWORD=生产库密码 export PROD_DB_HOST=生产库地址 - 验证数据库连接:用
psql直接连接DATABASE_URL指向的地址,确认服务器版本:
这样能明确看到实际连接的服务器版本,排查连接串是否错误。psql $DATABASE_URL # 连接成功后执行 SELECT version();
内容的提问来源于stack exchange,提问作者Стас Нікулиця
相关产品推荐
相关产品推荐

