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).

  • (из списка пунктов) Джанго 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,
    }
}

1) Не существует Postgres 3.12.5 вашей версии Python. 2) psql -V gives: psql (PostgreSQL) 12.3 говорит о том, что вы используете версию 12.3 клиента командной строки psql. Это не значит, что у вас обязательно должен быть работающий сервер Postgres 12.3, поскольку его можно установить как часть клиентского пакета. 3) Вам необходимо добавить к своему вопросу в виде текстового обновления информацию о том, какую ОС и версию вы используете и как вы установили Postgres. 4) Проект Django подключается к локальной или удаленной базе данных?

Adrian Klaver 24.08.2024 19:49

@Адриан Клавер Я думаю, ОП ясно дала понять в вопросе, что она использует локальную среду.

16171413 24.08.2024 20:15

@ 16171413. ... локальная среда для проекта Django, которая относится к тому, где работает Django. Это ничего не говорит о том, где работает база данных, к которой он подключается. Это будет любое значение DB_HOST. Я просил сделать это значение явным, а не зависеть от предположения.

Adrian Klaver 24.08.2024 21:01

@AdrianKlaver спасибо за то отличие, что версия psql — это клиент командной строки psql — это имеет смысл! И использовал локальную базу данных - из комментария ниже следует, что, вероятно, сама база данных нуждается в обновлении, что имеет смысл, поскольку я не трогал ее уже два года. Я иду по следу!

Diane Kaplan 24.08.2024 23:00

Если вы собираетесь обновиться, возможно, вам стоит перейти на Postgresql 16, поскольку он будет поддерживаться до 9 ноября 2028 года + или -. Дополнительную информацию см. в разделе Управление версиями Postgres. Вам также следует потратить некоторое время на изучение того, что у вас есть сейчас, поскольку found 10.13 и psql -V gives: psql (PostgreSQL) 12.3 обычно указывают на то, что у вас установлено более одного экземпляра Postgres.

Adrian Klaver 24.08.2024 23:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не можете удалить postgresql-10.13 с помощью pip, поскольку postgresql-10.13 не является пакетом Python.

Вы можете удалить определенную версию postgresql так же, как вы удаляете программы на своем компьютере. См. Удаление PostgreSQL.

Это не очень хороший совет. Слепое удаление без проверки того, что у вас запущено или сохранены ли где-то данные, — это верный путь к катастрофе.

Adrian Klaver 24.08.2024 19:52

@AdrianKlaver Я не могу найти нигде, где бы я советовал ОП удалить postgres. Давайте посмотрим на ее вопрос: она попыталась удалить старую версию postgresql, но ввела неправильную команду. Затем я сказал, что вы можете удалить определенную версию postgresql так же, как вы удаляете программы на своем компьютере. Это не совет, а ответ на то, что она уже пыталась сделать. Так кто же лучше знает содержимое базы данных, чем ее владелец? 🤔

16171413 24.08.2024 20:22

Если вы не думаете, что это совет, вы серьезно заблуждаетесь.

Adrian Klaver 24.08.2024 21:02

Удалить ее базу данных или нет - выбор ОП. Сэр, если у вас есть лучший ответ, вы можете опубликовать его здесь. Я хотел бы научиться

16171413 24.08.2024 22:47
Ответ принят как подходящий

По сути, вам нужно обновить PostgreSQL.

покопайтесь в pg_upgrade

вот документы https://www.postgresql.org/docs/current/pgupgrade.html

проблема возникает из-за базы данных postgresql, которая находится на вашем компьютере. Это старое :)

Это не пакет Python, pip здесь не поможет.

Или вы можете рассмотреть возможность сброса базы данных с помощью pg_dump, используя что-то вроде версии Postgres для компоновки Docker и пакета django-dbbackup для восстановления базы данных.

Конечно, это имеет смысл! Я могу установить обновление, пока коровы не вернутся домой, но да, локальная база данных двухлетней давности все еще будет старой и заплесневелой. Я посмотрю на эту ссылку и подтвержу, что как только обновлю базу данных, все будет готово — спасибо!!!

Diane Kaplan 24.08.2024 22:58

не уверен, сарказм это или нет, но в любом случае пожалуйста 🖖

Zwick Vitaly 24.08.2024 23:11

Ни капельки саркастичности, ваш ответ был именно таким - спасибо! Я только что подтвердил в свойствах версии самой локальной базы данных, что именно оттуда взялась версия 10.13! (И для следующих шагов я могу обновить это или сделать дамп/восстановить новую копию продукта, но это был ответ!)

Diane Kaplan 26.08.2024 20:44

Учитывая это /var/run/com.apple.security.cryptex и это vscode/extensions/ms-python.python-2024.12.3-darwin-x64, я скажу, что вы используете MacOS. Это означает четыре известных мне способа установки Postgres: а) Сборка из исходного кода. б) Установите с помощью Homebrew. в) Postgres.app г) Установите с помощью установщика EnterpriseDB.

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

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

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

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

  4. Если вы решили переместить данные, есть два варианта: а) Выполните 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

Другие вопросы по теме