Django venv находит старую версию PostgreSQL -> django.db.utils.NotSupportedError: Требуется PostgreSQL 13 или более поздняя версия
Я восстанавливаю локальное окружение для проекта Django, который я не запускал локально уже 2 года, работая над проблемами вокруг вещей, которые устарели. Но у меня есть одна немного другая: похоже, что Django находит/использует более старую версию PostgreSQL, чем та, которую я вижу в самом venv. Какой хороший подход для отслеживания старых версий, чтобы я мог их удалить?
Когда я запускаю python mysite/manage.py runserver
, я получаю
django.db.utils.NotSupportedError: PostgreSQL 13 or later is required (found 10.13).
НО когда я проверяю версии пакетов в запущенном venv, большинство пакетов актуальны, а PostgreSQL - 3.12.5 (не 13 или более поздняя версия, как нам в итоге понадобится, но и не 10.13).
(из списка pip) Django 5.1
(из списка pip) psycopg2 2.9.9
(из списка pip) psycopg2-binary 2.9.9
(из списка pip) psycopg2-pool 1.2
psql -V дает: psql (PostgreSQL) 12.3
python -v дает: Python 3.12.5
Удивительно, но если я попробую наивную деинсталляцию из venv (pip uninstall postgresql-10.13
), то он скажет, что он не установлен.
Какой хороший подход для отслеживания того, откуда может взяться 10.13?
Посмотрите в трассировке стека, эта ошибка NotSupportedError возникает при подключении к базе данных, из .venv/lib/python3.12/site-packages/django/db/backends/base/base.py", строка 200, in check_database_version_supported
Из venv, моя переменная $PATH имеет:
/Users/dkaplan/.vscode/extensions/ms-python.python-2024.12.3-darwin-x64/python_files/deactivate/bash:/Users/dkaplan/family-django/.venv/bin:/Library/Frameworks/Python.framework/Versions/3.12/bin:/Library/Frameworks/Python. framework/Versions/3.12/bin:/Library/Frameworks/Python.framework/Versions/3.10/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/dkaplan/.m2:/Applications/Postgres.app/Contents/Versions/latest/bin:/var/run/com.apple.security. cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Users/dkaplan/. vscode/extensions/ms-python.python-2024.12.3-darwin-x64/python_files/deactivate/bash:/Users/dkaplan/family-django/.venv/bin:/Library/Frameworks/Python.framework/Versions/3.12/bin:/Library/Frameworks/Python.framework/Versions/3.10/bin
>.
Мои настройки баз данных по умолчанию следующие:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"NAME": DB_DATABASE,
"USER": DB_USER,
"PASSWORD": DB_PASSWORD,
"HOST": DB_HOST,
"PORT": "5432",
"OPTIONS": DB_OPTIONS,
}
}
Вы не можете удалить postgresql-10.13 с помощью pip, потому что postgresql-10.13 не является пакетом Python.
Вы можете удалить определенную версию postgresql так же, как вы удаляете программы на вашей машине. См. раздел Удаление PostgreSQL.
В основном вам нужно обновить PostgreSQL
покопайтесь в pg_upgrade
Здесь есть документация https://www.postgresql.org/docs/current/pgupgrade.html
Проблема возникает из-за базы данных postgresql, которая находится на вашей машине. Она старая :)
Это не пакет python, pip здесь не поможет.
Или вы можете рассмотреть возможность дампирования базы данных с помощью pg_dump, использования чего-то вроде docker compose версии postgres и пакета django-dbbackup для восстановления базы данных
Учитывая это /var/run/com.apple.security.cryptex
и это vscode/extensions/ms-python.python-2024.12.3-darwin-x64
, я предположу, что вы работаете на MacOS. Это означает четыре известных мне способа установки Postgres: a) Сборка из исходников. b) Установка с помощью Homebrew. c) Postgres.app d) Установка с помощью программы установки EnterpriseDB.
Я бы сделал следующее:
Определите, какие экземпляры Postgres у вас установлены. Хорошим способом начать будет использование командной строки
ps ax | grep postgres
. Затем необходимо определить, какой из описанных выше методов использовался для установки Postgres (возможно, несколько методов). Если их несколько, выясните, какой из них содержит нужную вам информацию, DDL и данные.Примите решение о жизнеспособности данных. Я бы посоветовал сделать
pg_dump
из данных на случай, если позже окажется, что там была важная информация.Решите, на какую версию вы хотите перейти. В соответствии с моим комментарием я бы предложил Postgres 16, поскольку она дает вам наибольшее количество времени до того, как вам снова понадобится обновление. Установите эту версию.
Если вы решили перенести данные, то у вас есть два варианта: a) Выполнить pg_dump/pg_restore. Жизнь станет проще, если вы используете новую версию pg_dump для дампа старой базы данных Postgres. б) Использовать pg_upgrade.
Удалите старую версию (версии) Postgres, используя любой способ, предусмотренный инструментарием упаковки.
Защита на будущее согласно документации Django:
https://docs.djangoproject.com/en/5.1/ref/databases/#postgresql-notes
Django поддерживает PostgreSQL 13 и выше. Требуется psycopg 3.1.8+ или psycopg2 2.8.4+, хотя рекомендуется последняя версия psycopg 3.1.8+.
.
Примечание Поддержка psycopg2, вероятно, будет устаревшей и удалена в какой-то момент в будущем.
В настоящее время вы можете подумать о переходе на psycopg(3)
. Оговорка будет, если вы будете использовать psycopg2
вне приложения Django в этой среде. Есть некоторые существенные различия между psycopg2
и psycopg
см
Итак, @OP, эта проблема не связана с pip. Я столкнулся с подобной проблемой после обновления до Django 5.1 с 5.0.8 и получил ошибку:
django.db.utils.NotSupportedError: PostgreSQL 13 or later is required (found 12.20).
На самом деле это ожидаемо, поскольку, согласно заметкам к релизу Django 5.1, поддержка PostgreSQL 12 была прекращена, равно как и поддержка MariaDB 10.4.
У вас есть два варианта:
- Чтобы понизить версию Django до предыдущей версии, которая поддерживает текущую версию PostgreSQL.
- Обновить PostgreSQL/MariaDB до версии, поддерживаемой Django 5.1.
Полная информация о выпуске: https://docs.djangoproject.com/en/5.1/releases/5.1/
Как обновить PostgresQL?: https://www.postgresql.org/docs/current/upgrading.html