Peewee – лёгкая ORM

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

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

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

Введение

Работа с базой данных — неотъемлемая часть любой современной программы. Для Python существует множество ORM-библиотек, позволяющих удобно взаимодействовать с SQL-базами. Одной из самых простых и компактных является Peewee. Она идеально подходит для небольших проектов, скриптов и даже микросервисов.

Peewee – лёгкая ORM предлагает всё необходимое для описания моделей, выполнения запросов, работы с транзакциями и интеграции с веб-фреймворками — при этом её легко освоить и внедрить.

Принципы работы ORM и позиция Peewee

Что такое ORM

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

Когда выбирать Peewee

  • Если нужен простой и лёгкий инструмент

  • Если проект небольшой или экспериментальный

  • Если важна скорость разработки без сложной конфигурации

Установка и базовая настройка

Установить Peewee можно через pip:

bash
pip install peewee

Подключение к SQLite:

python
from peewee import SqliteDatabase db = SqliteDatabase('my_database.db')

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

python
from peewee import Model, CharField, DateField class BaseModel(Model): class Meta: database = db class Author(BaseModel): name = CharField() birth_date = DateField() db.connect() db.create_tables([Author])

Каждая модель наследует Model, и в Meta указывается используемая база данных.

Операции с базой данных (CRUD)

  • Создание записи:

python
author = Author.create(name='Фёдор Достоевский', birth_date='1821-11-11')
  • Чтение записей:

python
for author in Author.select(): print(author.name)
  • Обновление записи:

python
author.name = 'Ф. М. Достоевский' author.save()
  • Удаление записи:

python
author.delete_instance()

Фильтрация, сортировка и агрегации

python
# Фильтрация Author.select().where(Author.name.contains('Фёдор')) # Сортировка Author.select().order_by(Author.birth_date.desc()) # Агрегация from peewee import fn Author.select(fn.COUNT(Author.id)).scalar()

Отношения между моделями

python
from peewee import ForeignKeyField class Book(BaseModel): title = CharField() author = ForeignKeyField(Author, backref='books')

Это создаёт связь один-ко-многим между Author и Book.

Миграции в Peewee

Peewee не поддерживает миграции из коробки, но есть сторонние инструменты:

  • peewee-migrate – для управления миграциями

  • pwiz – генератор моделей из существующей базы

Установка:

bash
pip install peewee-migrate

Асинхронность и Peewee

Для асинхронных приложений можно использовать:

  • aiosqlite (через адаптеры)

  • peewee-async — обёртка над Peewee для asyncio

Пример подключения:

python
from peewee_async import Manager, PooledPostgresqlDatabase

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

Flask

python
from flask import Flask app = Flask(__name__) db.connect()

Можно использовать Flask-плагины для Peewee, например, Flask-Peewee.

FastAPI

В FastAPI можно создать dependency, возвращающую подключение к базе или сессию.

python
def get_db(): db.connect() try: yield db finally: db.close()

Работа с SQLite и другими СУБД

Peewee поддерживает:

  • SQLite (по умолчанию)

  • PostgreSQL (через psycopg2)

  • MySQL (через pymysql или mysqlclient)

Пример подключения к PostgreSQL:

python
from peewee import PostgresqlDatabase db = PostgresqlDatabase('mydb', user='user', password='pass', host='localhost')

Тестирование на Peewee

Для тестов удобно использовать SQLite в памяти:

python
db = SqliteDatabase(':memory:')

И создавать таблицы перед каждым тестом:

python
db.create_tables([Author, Book])

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

  • Уникальные поля: unique=True

  • Индексы: index=True

  • Ограничения: constraints=[...]

  • Работа с транзакциями:

python
with db.atomic(): Author.create(...)

Сравнение с другими 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

Установка

bash
pip install peewee

Дополнительно для PostgreSQL или MySQL:

bash
pip install psycopg2-binary # PostgreSQL pip install pymysql # MySQL

Подключение к базе данных

Класс Описание
SqliteDatabase("db.sqlite3") Подключение к SQLite.
PostgresqlDatabase(...) Подключение к PostgreSQL.
MySQLDatabase(...) Подключение к MySQL.
python
from peewee import SqliteDatabase db = SqliteDatabase("example.db")

Определение моделей

Компонент Описание
Model Базовый класс моделей.
class MyModel(Model) Описание таблицы.
Meta.database = db Назначение БД для модели.
CharField, IntegerField, ForeignKeyField и др. Поля модели.
python
from peewee import Model, CharField, IntegerField class User(Model): name = CharField() age = IntegerField() class Meta: database = db

Типы полей

Поле Описание
CharField(max_length) Строка с ограничением длины.
TextField() Текст без ограничения.
IntegerField(), FloatField() Числовые поля.
BooleanField() Булев тип.
DateField(), DateTimeField() Дата и время.
ForeignKeyField(Model) Связь с другой моделью.
AutoField() Автоинкрементное поле (обычно id).

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

Метод Описание
db.connect() Открывает соединение с БД.
db.create_tables([Model1, Model2]) Создает таблицы.
db.drop_tables([...]) Удаляет таблицы.
python
db.connect() db.create_tables([User])

Добавление и обновление данных

Метод Описание
Model.create(**kwargs) Добавляет новую запись.
Model.save() Сохраняет изменения.
Model.update().where().execute() Массовое обновление.
python
user = User.create(name="Ваня", age=22) user.age = 23 user.save()

Удаление данных

Метод Описание
Model.delete().where(...) Удаление с фильтром.
obj.delete_instance() Удаляет конкретный экземпляр.

Получение данных (запросы)

Метод Описание
Model.select() Возвращает все записи.
.where(...) Условия фильтрации.
.get() Получает одну запись (или вызывает DoesNotExist).
.first() Первый результат или None.
.order_by(Model.field) Сортировка.
.limit(n) / .offset(n) Ограничение и смещение.
python
users = User.select().where(User.age > 18).order_by(User.name)

Объединения (JOIN) и связи

Метод Описание
ForeignKeyField() Создание связи "один ко многим".
.join(Model) Объединение таблиц.
.select(ModelA, ModelB).join(...) Комплексные запросы.
python
class Post(Model): title = CharField() author = ForeignKeyField(User, backref='posts') posts = Post.select().join(User).where(User.name == "Ваня")

Агрегации и группировка

Метод Описание
fn.COUNT() Подсчет записей.
fn.SUM(), fn.AVG() Сумма, среднее и т.п.
.group_by() Группировка.
python
from peewee import fn User.select(fn.COUNT(User.id)).where(User.age > 18)

Транзакции

Метод Описание
with db.atomic(): Контекстный менеджер для транзакций.
db.rollback() Откат вручную.
python