Экосистема SQLAlchemy, версия 2.0+, настройка окружения, первое подключение
SQLAlchemy — это не просто ORM. Это полный toolkit для работы с базами данных в Python, сочетающий гибкость SQL с выразительностью Python.
SQLAlchemy — это библиотека уровня enterprise для работы с реляционными базами данных в Python. Она предоставляет:
SQLAlchemy 2.0 (выпущена в 2023) принесла фундаментальные изменения:
# SQLAlchemy 1.x (старый стиль, legacy)
session.query(User).filter_by(name='Alice').all()
# SQLAlchemy 2.0+ (современный стиль)
from sqlalchemy import select
session.execute(select(User).where(User.name == 'Alice')).scalars().all()Ключевые изменения 2.0:
select() (Core и ORM объединены)# Минимальная установка (только Core + ORM)
pip install sqlalchemy
# С psycopg для PostgreSQL (рекомендуется)
pip install sqlalchemy psycopg[binary]
# Или через poetry
poetry add sqlalchemy psycopg[binary]# asyncpg для PostgreSQL (самый быстрый драйвер)
pip install sqlalchemy asyncpg
# Или aiomysql для MySQL
pip install sqlalchemy aiomysql# Все зависимости для курса
poetry add sqlalchemy psycopg[binary] asyncpg alembic pydantic pytest pytest-asyncio
# Alembic часто устанавливается отдельно
poetry add alembicEngine — это центральный объект SQLAlchemy. Он управляет:
from sqlalchemy import create_engine
# PostgreSQL через psycopg
engine = create_engine(
'postgresql+psycopg://user:password@localhost:5432/mydb',
echo=True, # Логирование SQL (для отладки)
pool_size=10, # Размер пула соединений
max_overflow=20, # Дополнительные соединения при пике
pool_recycle=3600, # Пересоздавать соединения через час
)
# SQLite (для тестов и прототипов)
engine = create_engine('sqlite:///mydb.sqlite', echo=True)
# PostgreSQL async (asyncpg)
from sqlalchemy.ext.asyncio import create_async_engine
async_engine = create_async_engine(
'postgresql+asyncpg://user:password@localhost:5432/mydb',
echo=True,
)Формат URL:
dialect+driver://username:password@host:port/database
| База данных | URL |
|---|---|
| PostgreSQL (psycopg) | postgresql+psycopg://user:pass@localhost/db |
| PostgreSQL (asyncpg) | postgresql+asyncpg://user:pass@localhost/db |
| MySQL | mysql+pymysql://user:pass@localhost/db |
| SQLite | sqlite:///path/to/file.db |
| SQLite (in-memory) | sqlite:///:memory: |
Никогда не храните пароли в коде! Используйте .env:
# .env
DATABASE_URL=postgresql+psycopg://user:pass@localhost:5432/mydb
DATABASE_POOL_SIZE=10import os
from dotenv import load_dotenv
load_dotenv()
engine = create_engine(
os.getenv('DATABASE_URL'),
pool_size=int(os.getenv('DATABASE_POOL_SIZE', 10)),
)from sqlalchemy import text
# Простое подключение
with engine.connect() as conn:
result = conn.execute(text('SELECT 1'))
print(result.scalar()) # 1
# Транзакция (автоматический rollback)
with engine.begin() as conn:
conn.execute(text('INSERT INTO logs (message) VALUES (:msg)'),
{'msg': 'Test'})
# commit при выходе из блока┌─────────────────────────────────────────────────┐
│ SQLAlchemy 2.0+ │
├─────────────────────────────────────────────────┤
│ ORM (Declarative) │ Core (Table, select()) │
├─────────────────────────────────────────────────┤
│ Dialect Layer │
│ (postgresql, mysql, sqlite, oracle, ...) │
├─────────────────────────────────────────────────┤
│ DBAPI Drivers │
│ psycopg, asyncpg, pymysql, aiomysql, ... │
└─────────────────────────────────────────────────┘
| Инструмент | Назначение |
|---|---|
| Alembic | Миграции схемы БД |
| Greenlet | required для async (устанавливается автоматически) |
| psycopg | PostgreSQL драйвер (синхронный) |
| asyncpg | PostgreSQL драйвер (асинхронный, самый быстрый) |
# Используйте context manager для сессий
from sqlalchemy.orm import Session
with Session(engine) as session:
# работа с сессией
session.commit() # или rollback при ошибке
# Используйте параметры подключения
engine = create_engine(
url,
pool_pre_ping=True, # Проверка соединения перед использованием
pool_recycle=3600, # Пересоздание через час
)
# Закрывайте engine при завершении приложения
engine.dispose()# Не создавайте engine для каждого запроса
engine = create_engine(url) # ПЛОХО: нет пула
# Не храните пароли в коде
engine = create_engine('postgresql://admin:secret123@localhost/db') # ПЛОХО
# Не забывайте закрывать сессии
session = Session(engine)
session.query(...) # ПЛОХО: нет context managerУстановите PostgreSQL локально или используйте Docker:
docker run --rm -d \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=testdb \
-p 5432:5432 \
postgres:15Проверьте подключение:
from sqlalchemy import create_engine, text
engine = create_engine('postgresql+psycopg://postgres:postgres@localhost:5432/testdb')
with engine.connect() as conn:
result = conn.execute(text('SELECT version()'))
print(result.scalar())В следующей теме вы изучите SQLAlchemy Core — фундаментальный API для работы с SQL:
Table и MetaDataselect(), insert(), update(), delete()ConnectionCore — это основа, на которой построен ORM. Понимание Core сделает вас лучшим ORM-разработчиком.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.