"Требуется 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'),
}
}