FastAPI SQLAlchemy Toolkit
Project description
FastAPI SQLAlchemy Toolkit
FastAPI SQLAlchemy Toolkit -- это библиотека для стека FastAPI
+ Async SQLAlchemy
,
которая призвана решить следующие задачи:
-
Снижение количества шаблонного, копипастного кода, который возникает при разработке REST API и взаимодействии с СУБД средствами
SQLAlchemy
-
Встроенная валидация значений на уровне БД
Features
-
Декларативная фильтрация с помощью
FieldFilter
, в том числе по полям связанных моделей (см. раздел Фильтрация) -
Декларативная сортировка с помощью
ordering_dep
, в том числе по полям связанных моделей (см. раздел Сортировка) -
Методы для CRUD-операций с объектами в БД
-
Валидация существования внешних ключей
-
Валидация уникальных ограничений
-
Упрощение CRUD-действий с M2M связями
Установка
pip install fastapi-sqlalchemy-toolkit
Quick Start
Пример использования fastapi-sqlalchemy-toolkit
доступен в директории examples/app
Получение DB CRUD
Для использования fastapi-sqlaclhemy-toolkit
необходимо создать экземпляр BaseCRUD
для своей модели:
from fastapi_sqlalchemy_toolkit import BaseCRUD
from .models import MyModel
from .schemas import MyModelCreateSchema, MyModelUpdateSchema
my_model_db = BaseCRUD[MyModel, MyModelCreateSchema, MyModelUpdateSchema](MyModel)
Доступные методы BaseCrud
Ниже перечисленны доступные CRUD методы, предоставляемые BaseCrud
.
Документация параметров, принимаемых методами, находится в докстрингах
соответствующих методов.
create
- создание объекта (также выполняет валидацию значений полей на уровне БД)get
- получение объектаget_or_404
- получение объекта или ошибки 404exists
- проверка существования объектаpaginated_filter
- получение списка объектов с пагинациейfilter
- получение списка объектовcount
- получение количества объектовupdate
- обновление объекта (также выполняет валидацию значений полей на уровне БД)delete
- удаление объекта
Фильтрация
Если в эндпоинт FastAPI
нужно добавить фильтры по значениям полей, то код будет выглядеть примерно так:
@router.get("/my-objects")
async def get_my_objects(
session: CurrentSession,
user_id: UUID | None = None,
name: str | None = None
) -> list[MyObjectListSchema]:
stmt = select(MyModel)
if user_id is not None:
stmt = stmt.filter_by(user_id=user_id)
if name is not None:
stmt = stmt.filter_by(name=name)
result = await session.execute(stmt)
return results.scalars().all()
Уже видна дупликация шаблонного кода, а ведь это только строгие сравнения, и поля находятся на самой модели.
В fastapi-sqlalchemy-toolkit
этот эндпоинт выглядит так:
@router.get("/my-objects")
async def get_my_objects(
session: CurrentSession,
user_id: UUID | None = None,
name: str | None = None
) -> list[MyObjectListSchema]:
return await my_object_db.filter(session, user_id=user_id, name=name)
Дополнительные возможности декларативной фильтрации поддерживаются использованием класса FieldFilter
.
FieldFilter
позволяет:
- фильтровать по значениям полей связанных моделей при задании атрибута
model
. При этомBaseCrud
автоматически сделает необходимые join'ы, если это модель, которая напрямую связана с главной - использовать любые операторы сравнения через атрибут
operator
- применять функции SQLAlchemy к полям (например,
date()
)
Сортировка
`fastapi-sqlalchemy-toolkit`` поддеживает декларативную сортировку по полям модели, а также по полям связанных моделей. При этом необходимые для сортировки по полям связанных моделей join'ы будут сделаны автоматически.
Для применения декларативной сортировки нужно сделать следующее:
- Определить список полей, по которым доступна фильтрация. Поле может быть строкой, если это поле основной модели, или атрибутом модели, если оно находится на связанной модели.
child_ordering_fields = [
"title",
"created_at",
Parent.title,
Parent.created_at
]
- В параметрах энпдоинта передать определённый выше список
в
fastapi_sqlalchemy_toolkit.ordering_dep
@router.get("/children")
async def get_child_objects(
session: CurrentSession,
order_by: ordering_dep(child_ordering_fields)
) -> list[ChildListSchema]
- Передать параметр сортировки как параметр
order_by
в методыBaseCrud
return await child_db.filter(session=session, order_by=order_by)
Полезные примеры
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for fastapi_sqlalchemy_toolkit-0.0.2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | a14dc43396945feac0159182e1392d05e5180919bffd4024df79178f6a8e064c |
|
MD5 | 98b5be3f943d007215331ffd4f2a87f0 |
|
BLAKE2b-256 | b2ec3a2cb9acd5aad7606317dd7c06231355a528fcf254dc805ea09c91269e33 |
Hashes for fastapi_sqlalchemy_toolkit-0.0.2-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d6251b06fc6f10b1a0cb7cad2d3b43f9baf512aaa501fa3589e7c9fb9ccf04e3 |
|
MD5 | e14304e5ef16fa810b568660bf2d4550 |
|
BLAKE2b-256 | f307a2b5e3905c3e5227a9097fe341493849cabdf852eebe2be704eeac594de9 |