"Требуется PostgreSQL 12 или более поздняя версия (найдена 10.23)". Ошибка Django при подключении к PostgreSQL 16

Тип исключения: NotSupportedError

Значение исключения: Требуется PostgreSQL 12 или более поздняя версия (найдена 10.23).

Приведенное выше исключение выбрасывается бэкендом db. Очевидным предположением было бы несоответствие версий; это не так, как я убедился в этом. Соединение происходит с удаленной базой данных, работающей на v16. Действительно, я даже перенес службы, но безрезультатно, просто чтобы убедиться. Кроме того, это немного неточно, поскольку я смог выполнить миграцию, создать суперпользователя и создать несколько объектов от администраторов, прежде чем ошибка возникла снова.

settings/init.py:

import os

if os.environ.get("ENV_NAME") == 'production':
    from .production import *
elif os.environ.get("ENV_NAME") == 'staging':
    from .staging import *
else:
    from .base import *

settings/base.py (содержит базовые настройки)

settings/staging.py:

import os, logging

from .base import *

import dj_database_url # postgre db_url


#  debug is true in staging environment
DEBUG = True

# installed apps for prod only
INSTALLED_APPS += [

]

# read secret key from environment variable
SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")

# stripe api keys
STRIPE_SECRET_KEY = os.environ.get("STRIPE_SECRET_KEY")
STRIPE_PUBLISHABLE_KEY = os.environ.get("STRIPE_PUBLISHABLE_KEY")


# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
# set to use postgre backend in production
DATABASES['default'] = dj_database_url.parse( os.environ.get("DATABASE_URL"),
                                                 conn_max_age=600)

requirements.txt

asgiref==3.8.1
babel==2.16.0
certifi==2024.8.30
charset-normalizer==3.3.2
crispy-bootstrap5==2024.2
dj-database-url==2.2.0
Django==4.2
django-crispy-forms==2.3
django-environ==0.11.2
django-money==3.5.3
gunicorn==23.0.0
idna==3.8
packaging==24.1
psycopg2-binary==2.9.9
py-moneyed==3.0
python-dateutil==2.9.0.post0
requests==2.32.3
six==1.16.0
sqlparse==0.5.1
stripe==10.10.0
typing_extensions==4.12.2
tzdata==2024.1
urllib3==2.2.2
whitenoise==6.7.0

версия в БД: PostgreSQL 16.4

Понятно, что есть проблема с бэкэндом подключения, но не ясно, в чем именно она заключается. Трудно воспроизвести на localhost НО я заметил и с командой "migrate" на localhost, которую я собирался найти способ обойти.

Stacktrace:

Как и все комментарии, которые вы видели под своим сообщением, ясно, что вы используете неправильный экземпляр БД.

Предложение 1

Предполагая, что переменная находится в нашей системной переменной окружения, попробуйте сделать следующее:

echo DATABASE_URL

После вывода вы ясно увидите, в чем проблема.

Последним моим предложением будет загрузить ваши секреты в ваш settings.py файл.

#settings.py

# Specify the path to your .env file
ENV_FILE_PATH = os.path.join(BASE_DIR, '.env')

# Read the .env file
environ.Env.read_env(ENV_FILE_PATH)

Предложение 2:

Почему бы не попробовать использовать:

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env('DB_NAME'),
        'USER': env('DB_USER'),
        'PASSWORD': env('DB_PASSWORD'),
        'HOST': env('DB_HOST'),
        'PORT': env('DB_PORT'),
    }
}
Вернуться на верх