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

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,提问作者Стас Нікулиця

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:20