Перейти к основному содержимому

База данных

Подключение​

Каждый проект получает отдельную базу PostgreSQL. Параметры подключения автоматически доступны в контейнере через переменные окружения:

# Django — settings.py
import os
import dj_database_url

DATABASES = {
'default': dj_database_url.config(
default=os.environ['DATABASE_URL']
)
}
# FastAPI — database.py
import os
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])

Миграции​

Миграции применяются автоматически перед каждым деплоем.

Django:

# Создать миграцию локально
python manage.py makemigrations
python manage.py migrate

# Коммитнуть файлы миграций
git add .
git commit -m "add: migration for UserProfile"
git push

Alembic (FastAPI):

alembic revision --autogenerate -m "add user profile"
alembic upgrade head
Важно

Файлы миграций — часть кода. Всегда коммить их вместе с изменениями моделей. Без этого деплой создаст таблицы без схемы.

Подключение к базе локально​

Для локальной разработки используй Docker Compose:

# docker-compose.yml
services:
db:
image: postgres:16
environment:
POSTGRES_DB: myapp
POSTGRES_USER: myapp
POSTGRES_PASSWORD: myapp
ports:
- "5432:5432"

backend:
build: ./backend
environment:
DATABASE_URL: postgresql://myapp:myapp@db:5432/myapp
depends_on:
- db
ports:
- "8000:8000"
docker compose up -d
docker compose exec backend python manage.py migrate

pgBouncer (connection pooling)​

В кластере перед PostgreSQL стоит pgBouncer — пул соединений. Это прозрачно для большинства операций, но есть ограничение:

Django и pgBouncer

Django в некоторых конфигурациях не совместим с pgBouncer в transaction mode. Если видишь ошибку prepared statement already exists, убедись что в DATABASE_URL есть ?pgbouncer=true — это уже прописано в кластере автоматически.