# CRUD Generic async CRUD operations for SQLAlchemy models with search, pagination, and many-to-many support. !!! info This module has been coded and tested to be compatible with PostgreSQL only. ## Overview The `crud` module provides [`AsyncCrud`](../reference/crud.md#fastapi_toolsets.crud.factory.AsyncCrud), an abstract base class with a full suite of async database operations, and [`CrudFactory`](../reference/crud.md#fastapi_toolsets.crud.factory.CrudFactory), a convenience function to instantiate it for a given model. ## Creating a CRUD class ```python from fastapi_toolsets.crud import CrudFactory from myapp.models import User UserCrud = CrudFactory(model=User) ``` [`CrudFactory`](../reference/crud.md#fastapi_toolsets.crud.factory.CrudFactory) dynamically creates a class named `AsyncUserCrud` with `User` as its model. ## Basic operations ```python # Create user = await UserCrud.create(session=session, obj=UserCreateSchema(username="alice")) # Get one (raises NotFoundError if not found) user = await UserCrud.get(session=session, filters=[User.id == user_id]) # Get first or None user = await UserCrud.first(session=session, filters=[User.email == email]) # Get multiple users = await UserCrud.get_multi(session=session, filters=[User.is_active == True]) # Update user = await UserCrud.update(session=session, obj=UserUpdateSchema(username="bob"), filters=[User.id == user_id]) # Delete await UserCrud.delete(session=session, filters=[User.id == user_id]) # Count / exists count = await UserCrud.count(session=session, filters=[User.is_active == True]) exists = await UserCrud.exists(session=session, filters=[User.email == email]) ``` ## Pagination !!! info "Added in `v1.1` (only offset_pagination via `paginate` if ` Response[UserRead]: return await crud.UserCrud.get( session=session, filters=[User.id == uuid], schema=UserRead, ) @router.get("") async def list_users(session: SessionDep, page: int = 1) -> PaginatedResponse[UserRead]: return await crud.UserCrud.offset_paginate( session=session, page=page, schema=UserRead, ) ``` The schema must have `from_attributes=True` (or inherit from [`PydanticBase`](../reference/schemas.md#fastapi_toolsets.schemas.PydanticBase)) so it can be built from SQLAlchemy model instances. !!! warning "Deprecated: `as_response`" The `as_response=True` parameter is **deprecated** and will be removed in **v2.0**. Replace it with `schema=YourSchema`. --- [:material-api: API Reference](../reference/crud.md)