Как подключиться к СУБД PostgreSQL на PythonAnywhere?
Я загрузил сайт, который представляет собой базовый сайт Django "Hello World" с некоторыми изменениями. Во-первых, БД настроена на использование Postgres. Это прекрасно работает локально, но у меня возникают проблемы с пониманием того, как завершить настройку на PythonAnywhere.
На PA БД была настроена с помощью psql
следующим образом:
CREATE DATABASE domain_db;
CREATE USER domain_admin WITH PASSWORD '123456789';
\connect domain_db;
CREATE SCHEMA domain_schema AUTHORIZATION domain_admin;
-- Settings recommended by Django documentation
ALTER ROLE domain_admin SET client_encoding TO 'utf8';
ALTER ROLE domain_admin SET default_transaction_isolation TO 'read committed';
ALTER ROLE domain_admin SET timezone TO 'UTC';
Обратите внимание, что этот подход основан на рекомендациях в связи с изменениями в разрешениях Postgres в версии 15 (которую мы используем локально). Я предполагаю, что это работает и с v12, которую, как я думаю, использует PA. Могу ошибаться в этом вопросе.
<https://www.cybertec-postgresql.com/en/error-permission-denied-schema-public/
Структура каталога проекта выглядит следующим образом:
domain/
site/
_config/
settings/
base.py Settings common to local and production
local.py Local development settings
production.py Production server settings
asgi.py
urls.py
wsgi.py
staticfiles/
manage.py
venv
.env
В base.py
я настраиваю базу данных, используя переменные окружения, загруженные из файла .env
. Я подтвердил, что файл .env
загружается и переменные окружения устанавливаются в соответствии с его содержимым.
BASE_DIR = Path(__file__).resolve().parent.parent.parent
...
env = environ.Env()
env_file_path = BASE_DIR.parent / ".env"
env.read_env(env_file_path)
...
DATABASES = {
'default': {
"ENGINE": env("ENGINE"),
"OPTIONS": env.json("OPTIONS", default={}),
"NAME": env("NAME"),
"USER": env("USER"),
"PASSWORD": env("PASSWORD"),
"HOST": env("HOST"),
"PORT": env("PORT"),
}
}
Релевантные части файла .env
(данные изменены для этого поста):
ALLOWED_HOSTS=www.<domain>.com,<domain>.com
# Database
ENGINE=django.db.backends.postgresql
OPTIONS={"options": "-c search_path=domain_schema"}
NAME=domain_db
USER=domain_admin
PASSWORD=123456789
HOST=<prefix>.postgres.pythonanywhere-services.com
PORT=<port provided by PA>
Когда я пытаюсь запустить makemigrations
, я получаю следующую ошибку (отредактировано):
/django/core/management/commands/makemigrations.py:160:
RuntimeWarning: Got an error checking a consistent migration history performed for database connection 'default':
connection failed: connection to server at "xx.xx.xx.xx", port <xxxxx> failed:
FATAL: password authentication failed for user <user> connection to server at "xx.xx.xx.xx.", port <xxxxx> failed:
FATAL: password authentication failed for user <user>
Я подтвердил соединение, используя:
psql -h <prefix>.postgres.pythonanywhere-services.com -U domain_admin -d domain_db -p <port>
Не совсем понимаю, куда двигаться дальше. Я думаю, что настройки в .env
правильные. Есть ли что-то еще, что я должен настроить, чтобы это работало? Или же Postgres v12 нуждается в совершенно иной конфигурации по сравнению с тем, что мы используем локально (v15). Если это так, есть ли способ обновить версию до v15, чтобы привести ее в соответствие с локальной?