Введение
Работа с базой данных — неотъемлемая часть любой современной программы. Для Python существует множество ORM-библиотек, позволяющих удобно взаимодействовать с SQL-базами. Одной из самых простых и компактных является Peewee. Она идеально подходит для небольших проектов, скриптов и даже микросервисов.
Peewee – лёгкая ORM предлагает всё необходимое для описания моделей, выполнения запросов, работы с транзакциями и интеграции с веб-фреймворками — при этом её легко освоить и внедрить.
Принципы работы ORM и позиция Peewee
Что такое ORM
ORM (Object-Relational Mapping) — это технология, позволяющая работать с базами данных через объекты языка программирования. Вместо SQL-запросов вы создаёте и взаимодействуете с Python-классами, а ORM преобразует это в SQL.
Когда выбирать Peewee
-
Если нужен простой и лёгкий инструмент
-
Если проект небольшой или экспериментальный
-
Если важна скорость разработки без сложной конфигурации
Установка и базовая настройка
Установить Peewee можно через pip:
Подключение к SQLite:
Создание моделей данных
Каждая модель наследует Model
, и в Meta
указывается используемая база данных.
Операции с базой данных (CRUD)
-
Создание записи:
-
Чтение записей:
-
Обновление записи:
-
Удаление записи:
Фильтрация, сортировка и агрегации
Отношения между моделями
Это создаёт связь один-ко-многим между Author
и Book
.
Миграции в Peewee
Peewee не поддерживает миграции из коробки, но есть сторонние инструменты:
-
peewee-migrate – для управления миграциями
-
pwiz – генератор моделей из существующей базы
Установка:
Асинхронность и Peewee
Для асинхронных приложений можно использовать:
-
aiosqlite (через адаптеры)
-
peewee-async — обёртка над Peewee для asyncio
Пример подключения:
Интеграция с Flask и FastAPI
Flask
Можно использовать Flask-плагины для Peewee, например, Flask-Peewee
.
FastAPI
В FastAPI можно создать dependency, возвращающую подключение к базе или сессию.
Работа с SQLite и другими СУБД
Peewee поддерживает:
-
SQLite (по умолчанию)
-
PostgreSQL (через psycopg2)
-
MySQL (через pymysql или mysqlclient)
Пример подключения к PostgreSQL:
Тестирование на Peewee
Для тестов удобно использовать SQLite в памяти:
И создавать таблицы перед каждым тестом:
Расширенные возможности Peewee
-
Уникальные поля:
unique=True
-
Индексы:
index=True
-
Ограничения:
constraints=[...]
-
Работа с транзакциями:
Сравнение с другими ORM
ORM | Простота | Гибкость | Асинхронность | Подходит для |
---|---|---|---|---|
Peewee | Очень высокая | Средняя | Частичная | Малые и средние проекты |
SQLAlchemy | Средняя | Очень высокая | Да | Средние и крупные проекты |
Django ORM | Высокая | Средняя | Частично | Веб-приложения на Django |
Сообщество и документация
Peewee имеет хорошую документацию, активную GitHub-страницу и стабильные обновления. Это зрелый проект, проверенный временем.
Часто задаваемые вопросы (FAQ)
1. Что такое Peewee?
Peewee — это лёгкая и простая ORM-библиотека для Python, поддерживающая SQLite, PostgreSQL и MySQL.
2. Подходит ли Peewee для крупных проектов?
В основном рекомендуется для небольших и средних проектов, хотя и может использоваться в более сложных решениях.
3. Есть ли у Peewee миграции?
Да, с помощью сторонних инструментов, таких как peewee-migrate
.
4. Поддерживает ли Peewee асинхронность?
Частично, через peewee-async
и совместные решения.
5. Можно ли использовать Peewee с Flask и FastAPI?
Да, интеграция возможна и хорошо документирована.
6. Как работает связь между моделями в Peewee?
Через ForeignKeyField
, аналогично другим ORM.
Полный справочник по ключевым функциям и модулям библиотеки Peewee для Python
Установка
Дополнительно для PostgreSQL или MySQL:
Подключение к базе данных
Класс | Описание |
---|---|
SqliteDatabase("db.sqlite3") |
Подключение к SQLite. |
PostgresqlDatabase(...) |
Подключение к PostgreSQL. |
MySQLDatabase(...) |
Подключение к MySQL. |
Определение моделей
Компонент | Описание |
---|---|
Model |
Базовый класс моделей. |
class MyModel(Model) |
Описание таблицы. |
Meta.database = db |
Назначение БД для модели. |
CharField , IntegerField , ForeignKeyField и др. |
Поля модели. |
Типы полей
Поле | Описание |
---|---|
CharField(max_length) |
Строка с ограничением длины. |
TextField() |
Текст без ограничения. |
IntegerField() , FloatField() |
Числовые поля. |
BooleanField() |
Булев тип. |
DateField() , DateTimeField() |
Дата и время. |
ForeignKeyField(Model) |
Связь с другой моделью. |
AutoField() |
Автоинкрементное поле (обычно id ). |
Создание таблиц
Метод | Описание |
---|---|
db.connect() |
Открывает соединение с БД. |
db.create_tables([Model1, Model2]) |
Создает таблицы. |
db.drop_tables([...]) |
Удаляет таблицы. |
Добавление и обновление данных
Метод | Описание |
---|---|
Model.create(**kwargs) |
Добавляет новую запись. |
Model.save() |
Сохраняет изменения. |
Model.update().where().execute() |
Массовое обновление. |
Удаление данных
Метод | Описание |
---|---|
Model.delete().where(...) |
Удаление с фильтром. |
obj.delete_instance() |
Удаляет конкретный экземпляр. |
Получение данных (запросы)
Метод | Описание |
---|---|
Model.select() |
Возвращает все записи. |
.where(...) |
Условия фильтрации. |
.get() |
Получает одну запись (или вызывает DoesNotExist ). |
.first() |
Первый результат или None . |
.order_by(Model.field) |
Сортировка. |
.limit(n) / .offset(n) |
Ограничение и смещение. |
Объединения (JOIN) и связи
Метод | Описание |
---|---|
ForeignKeyField() |
Создание связи "один ко многим". |
.join(Model) |
Объединение таблиц. |
.select(ModelA, ModelB).join(...) |
Комплексные запросы. |
Агрегации и группировка
Метод | Описание |
---|---|
fn.COUNT() |
Подсчет записей. |
fn.SUM() , fn.AVG() |
Сумма, среднее и т.п. |
.group_by() |
Группировка. |
Транзакции
Метод | Описание |
---|---|
with db.atomic(): |
Контекстный менеджер для транзакций. |
db.rollback() |
Откат вручную. |