SQLAlchemy – ORM для SQL-баз

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Работа с реляционными базами данных является неотъемлемой частью разработки большинства веб-приложений. Написание «сырого» SQL-кода часто бывает рутинным и подверженным ошибкам. Именно здесь на помощь приходит ORM — объектно-реляционное отображение. В Python наиболее зрелым и гибким решением в этой области является SQLAlchemy.

SQLAlchemy – ORM для SQL-баз предоставляет разработчику мощный инструмент для взаимодействия с СУБД на высокоуровневом уровне, сохраняя при этом контроль над SQL-запросами.

Что такое ORM и как работает SQLAlchemy

Принципы объектно-реляционного отображения

ORM — это метод связывания таблиц базы данных с объектами и классами в языке программирования. Вместо того чтобы писать SQL-запросы напрямую, разработчик оперирует Python-классами и их свойствами.

SQLAlchemy как мост между Python и SQL

SQLAlchemy предоставляет два уровня работы:

  • Core — низкоуровневый SQL-конструктор, ближе к ручному управлению запросами.

  • ORM — высокоуровневый интерфейс, позволяющий описывать структуру базы через классы Python.

Компоненты SQLAlchemy

ORM-уровень

Используется декларативный стиль, где таблицы описываются через Python-классы, наследуемые от Base.

Core-уровень

Позволяет использовать выражения SQL на Python-языке, полезно для создания динамических запросов или скриптов миграций.

Установка и настройка

bash
pip install sqlalchemy

Создание подключения:

python
from sqlalchemy import create_engine engine = create_engine("sqlite:///example.db", echo=True)

Создание моделей данных

python
from sqlalchemy.orm import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) email = Column(String, unique=True)

Создание таблиц:

python
Base.metadata.create_all(engine)

Создание и выполнение запросов

python
from sqlalchemy.orm import Session session = Session(bind=engine) # Создание пользователя new_user = User(name="Иван", email="ivan@example.com") session.add(new_user) session.commit() # Получение пользователей users = session.query(User).filter(User.name == "Иван").all()

Сессия и управление транзакциями

Объект Session — это контейнер, через который происходит взаимодействие с базой данных. Он управляет:

  • добавлением объектов

  • отслеживанием изменений

  • транзакциями

python
try: session.commit() except: session.rollback()

Связи между таблицами

python
from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) user = relationship("User", backref="addresses")

Работа с Alembic для миграций

bash
pip install alembic alembic init alembic

Настраивается путь к базе и моделям, затем создаются миграции:

bash
alembic revision --autogenerate -m "initial" alembic upgrade head

Асинхронная работа с базой (Async ORM)

SQLAlchemy 1.4+ поддерживает асинхронный режим:

python
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession engine = create_async_engine("sqlite+aiosqlite:///example.db") async with AsyncSession(engine) as session: ...

Интеграция с FastAPI и Flask

Во Flask используется классическая модель SessionLocal, а во FastAPI — через dependency injection.

python
from fastapi import Depends def get_db(): db = SessionLocal() try: yield db finally: db.close()

Оптимизация запросов и производительность

  • lazy='joined': eager loading

  • Индексы в колонках: index=True

  • Использование selectinload, joinedload для оптимизации

Тестирование и мокинг базы данных

Для юнит-тестов удобно использовать SQLite in-memory:

python
engine = create_engine("sqlite:///:memory:")

Расширенные возможности SQLAlchemy

  • Гибридные свойства @hybrid_property

  • Композитные ключи

  • Прослушиватели событий (event.listen)

Сравнение с другими ORM

ORM Уровень контроля Простота Асинхронность Документация
SQLAlchemy Высокий Средняя Да Отличная
Django ORM Средний Высокая Ограниченная Хорошая
Tortoise ORM Средний Высокая Да Ограниченная

Будущее SQLAlchemy и сообщество

Проект активно развивается. Версия 2.0 принесла упрощённый синтаксис, улучшения типизации и поддержку современных паттернов разработки.

Часто задаваемые вопросы (FAQ)

1. Что такое SQLAlchemy?
Это Python-библиотека для работы с реляционными базами данных через ORM или SQL-конструктор.

2. Чем отличается Core от ORM?
Core предоставляет низкоуровневый доступ, ORM — объектно-ориентированную обертку.

3. Поддерживает ли SQLAlchemy асинхронность?
Да, начиная с версии 1.4 — через AsyncSession.

4. Можно ли использовать SQLAlchemy с PostgreSQL?
Да, через psycopg2 или asyncpg драйверы.

5. Что лучше: SQLAlchemy или Django ORM?
SQLAlchemy дает больше гибкости и контроля, но требует больше настроек.

6. Подходит ли SQLAlchemy для больших проектов?
Да, он масштабируется и используется в крупных проектах.

Полный справочник по ключевым функциям и модулям библиотеки SQLAlchemy для Python

Установка

bash
pip install sqlalchemy

Если вы работаете с конкретной СУБД, установите соответствующий драйвер:

  • PostgreSQL: pip install psycopg2-binary

  • MySQL: pip install pymysql

  • SQLite: встроен в Python


Создание подключения и движка

Функция Описание
create_engine(url) Создает подключение к БД.
engine.connect() Получает соединение.
engine.begin() Контекстный менеджер транзакции.
python
from sqlalchemy import create_engine engine = create_engine("sqlite:///example.db", echo=True)

Декларативная ORM-модель

Компонент Описание
declarative_base() Базовый класс для всех моделей.
class Model(Base) Определение таблицы через класс.
__tablename__ Название таблицы в БД.
Column(...) Определение столбцов.
relationship(...) Связи между таблицами.
python
from sqlalchemy.orm import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) name = Column(String)

Типы данных

Тип Описание
Integer, String(length), Boolean Стандартные типы.
Date, DateTime, Float, Text Дополнительные типы.
ForeignKey('table.column') Внешний ключ.
Enum(...), JSON, LargeBinary Расширенные типы данных.

Создание таблиц

Метод Описание
Base.metadata.create_all(engine) Создает все таблицы из моделей.
Base.metadata.drop_all(engine) Удаляет все таблицы.

Работа с сессией (ORM)

Компонент Описание
Session(engine) Создает сессию для работы с БД.
.add(obj) Добавляет объект.
.add_all([obj1, obj2]) Добавление нескольких объектов.
.commit() Сохраняет изменения.
.rollback() Откатывает транзакцию.
.query(Model) Запрос к таблице (ORM).
.get(id) Получает по первичному ключу.
.delete(obj) Удаляет объект.
python
from sqlalchemy.orm import Session with Session(engine) as session: user = User(name="Ваня") session.add(user) session.commit()

Запросы ORM (SQLAlchemy ORM)

Метод Описание
.filter(...) Фильтрация данных.
.filter_by(name="Ваня") Упрощённая фильтрация.
.first() Первый результат.
.all() Все строки.
.count() Количество строк.
.order_by(...) Сортировка.
.limit(n) / .offset(n) Ограничение и смещение.
python
users = session.query(User).filter(User.name == "Ваня").all()

Связи и отношения (relationship)

Тип связи Описание
relationship("OtherModel") Связь с другой таблицей.
back_populates="..." Двунаправленная связь.
ForeignKey() Связывает внешний ключ.
python
class Post(Base): __tablename__ = "posts" id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey("users.id")) user = relationship("User", back_populates="posts") class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) posts = relationship("Post", back_populates="user")

SQL Expression Language (Core)

Метод Описание
Table(...) Определяет таблицу.
select(users) SQL SELECT-запрос.
insert(), update(), delete() SQL DML-запросы.
conn.execute(stmt) Выполнение SQL-запроса.
python
from sqlalchemy import Table, MetaData, select metadata = MetaData() users = Table("users", metadata, autoload_with=engine) stmt = select(users).where(users.c.name == "Ваня") with engine.connect() as conn: result = conn.execute(stmt)

Асинхронный SQLAlchemy (async)

Компонент Описание
create_async_engine() Создает асинхронный движок.
AsyncSession() Асинхронная сессия.
async with Контекст асинхронного подключения.
python
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession engine = create_async_engine("sqlite+aiosqlite:///db.sqlite3") async with AsyncSession(engine) as session: ...

Миграции с Alembic

Инструмент Описание
alembic init alembic Инициализация.
alembic revision --autogenerate -m "msg" Генерация миграции.
alembic upgrade head Применение миграций.

Интеграции

Библиотека Использование
FastAPI Через Depends(get_session) и AsyncSession.
Flask Используется с Flask-SQLAlchemy.
Alembic Управление миграциями.
Pydantic Для валидации моделей при сериализации.

Заключение

SQLAlchemy – ORM для SQL-баз — это зрелое и мощное решение, объединяющее удобство Python и гибкость SQL. Благодаря богатым возможностям, поддержке асинхронности и активному сообществу, SQLAlchemy подходит как для небольших API, так и для сложных enterprise-приложений.

Если вы хотите писать чистый и масштабируемый код, SQLAlchemy — один из лучших выборов в экосистеме Python.