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.

Я бы сделал следующее:

  1. Определите, какие экземпляры Postgres у вас установлены. Хорошим способом начать будет использование командной строки ps ax | grep postgres. Затем необходимо определить, какой из описанных выше методов использовался для установки Postgres (возможно, несколько методов). Если их несколько, выясните, какой из них содержит нужную вам информацию, DDL и данные.

  2. Примите решение о жизнеспособности данных. Я бы посоветовал сделать pg_dump из данных на случай, если позже окажется, что там была важная информация.

  3. Решите, на какую версию вы хотите перейти. В соответствии с моим комментарием я бы предложил Postgres 16, поскольку она дает вам наибольшее количество времени до того, как вам снова понадобится обновление. Установите эту версию.

  4. Если вы решили перенести данные, то у вас есть два варианта: a) Выполнить pg_dump/pg_restore. Жизнь станет проще, если вы используете новую версию pg_dump для дампа старой базы данных Postgres. б) Использовать pg_upgrade.

  5. Удалите старую версию (версии) Postgres, используя любой способ, предусмотренный инструментарием упаковки.

  6. Защита на будущее согласно документации 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 см

.

https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html

Итак, @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.

У вас есть два варианта:

  1. Чтобы понизить версию Django до предыдущей версии, которая поддерживает текущую версию PostgreSQL.
  2. Обновить PostgreSQL/MariaDB до версии, поддерживаемой Django 5.1.

Полная информация о выпуске: https://docs.djangoproject.com/en/5.1/releases/5.1/

Как обновить PostgresQL?: https://www.postgresql.org/docs/current/upgrading.html

Вернуться на верх