Я воскрешаю свою локальную среду для проекта 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).
(из списка пунктов) Джанго 5.1
(из списка пипсов) psycopg2 2.9.9
(из списка пипов) psycopg2-binary 2.9.9
(из списка пипов) 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, в 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,
}
}
🤔 А знаете ли вы, что...
Django поддерживает множество баз данных, включая PostgreSQL, MySQL, SQLite и Oracle.
Вы не можете удалить 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, используя что-то вроде версии Postgres для компоновки Docker и пакета django-dbbackup для восстановления базы данных.
Учитывая это /var/run/com.apple.security.cryptex
и это vscode/extensions/ms-python.python-2024.12.3-darwin-x64
, я скажу, что вы используете MacOS. Это означает четыре известных мне способа установки Postgres: а) Сборка из исходного кода. б) Установите с помощью Homebrew. в) Postgres.app г) Установите с помощью установщика EnterpriseDB.
Я бы сделал следующее:
Определите, какие экземпляры Postgres у вас установлены. С командной строки ps ax | grep postgres
было бы неплохо начать. Затем вам нужно будет определить, какой из вышеперечисленных методов использовался для установки Postgres (возможно, несколько методов). Если существует несколько экземпляров, выясните, какой из них содержит нужную вам информацию, DDL, а также данные.
Примите решение относительно жизнеспособности данных. Я бы посоветовал сделать pg_dump
данных на тот случай, если позже окажется, что там была важная информация.
Решите, на какую версию вы хотите перейти. Согласно моему комментарию, я бы предложил Postgres 16, поскольку он дает вам больше времени, прежде чем вам снова понадобится обновление. Установите эту версию.
Если вы решили переместить данные, есть два варианта: а) Выполните 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
есть некоторые существенные различия: см.:
https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html