Как перенести Django из локального sqlite3 в контейнер postgresql Docker?
Я пытаюсь изучить Django с помощью нескольких демонстрационных проектов и хочу перейти с sqlite3 на локальный контейнер postgresql для работы с разработчиками. Когда я пытаюсь запустить uv run python manage.py migrate
, я получаю следующее исключение:
django.db.utils.OperationalError: connection failed: connection to server at "127.0.0.1", port 5432 failed: FATAL: password authentication failed for user "myuser"
Пока контейнер запущен, база данных доступна через psql
, и мой pg_hba.conf
, похоже, должен разрешать аутентификацию:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host all all all scram-sha-256
Я создаю и запускаю свой контейнер postgresql с помощью:
docker run --name=db_container -d -e POSTGRES_DB=mydatabase -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypassword -p 5432:5432 postgres:16.2
Мой файл .env содержит:
POSTGRES_DB=mydatabase
POSTGRES_USER=myuser
POSTGRES_PASSWORD=mypassword
HOST=localhost
PORT=5432
Мой файл settings.py
содержит:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': config('POSTGRES_DB'),
'USER': config('POSTGRES_USER'),
'PASSWORD': config('POSTGRES_PASSWORD'),
'HOST': config('HOST'),
'PORT': config('PORT'),
}
}
Для дополнительной справки я использую Python 3.12 и следующие зависимости:
"asgiref>=3.8.1",
"django>=5.1.6",
"django-taggit>=6.1.0",
"markdown>=3.7",
"psycopg>=3.2.5",
"python-decouple>=3.8",
"sqlparse>=0.5.3"
Как мне использовать контейнер postgres в качестве локальной базы данных разработчиков в моем приложении Django?
ХОСТ в файле .env
должен быть именем вашего локального запущенного контейнера docker.
Итак, в вашем случае env-файл должен быть примерно таким:
POSTGRES_DB=mydatabase
POSTGRES_USER=myuser
POSTGRES_PASSWORD=mypassword
HOST=db_container
PORT=5432
<время работы/>
У меня есть аналогичная настройка для локальной разработки, но также используется docker-compose:
.env
[...]
DB_NAME=DB_TEST
DB_USER=username
DB_PASS=pwd
DB_HOST=db
DB_PORT=5432
[...]
docker-compose.yaml
version: "3.9"
services:
web:
[...]
db:
image: postgres
[...]
env_file: ./porjectfolder/project_name/settings/.env
[...]
settings.py
[...]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': env('DB_NAME'),
'USER': env('DB_USER'),
'PASSWORD': env('DB_PASS'),
'HOST': env('DB_HOST'),
'PORT': env('DB_PORT'),NAME": "test_db_learnbattle",
}
}
[...]