Services
Execution Workflow
-
Start from the repository and wrap it with SQLAlchemyAsyncRepositoryService or SQLAlchemySyncRepositoryService .
-
Define schema types for create, update, and read flows only where service boundaries need validation or conversion.
-
Set repository_type , loader options, and match_fields explicitly.
-
Override create() , update() , or to_model() only for real domain rules such as slug generation or multi-model coordination.
-
Convert outbound models with to_schema() instead of leaking ORM instances to transport layers.
Implementation Rules
-
Keep services responsible for business rules, not controller or router concerns.
-
Accept dictionaries or schema objects, but normalize them consistently through the service.
-
Use schema conversion intentionally: Pydantic, Msgspec, and attrs are all supported.
-
Keep multi-repository workflows atomic and explicit about commit behavior.
Example Pattern
from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService
class PostService(SQLAlchemyAsyncRepositoryService[Post, PostRepository]): repository_type = PostRepository
Validation Checklist
-
Confirm service input can be converted into models for both create and update paths.
-
Confirm to_schema() returns the expected response shape for the chosen schema library.
-
Confirm custom service overrides preserve repository invariants.
-
Confirm complex operations load the relationships they depend on.
Cross-Skill Handoffs
-
Use advanced-alchemy-repositories for persistence operations beneath the service.
-
Use advanced-alchemy-routing when mapping service methods onto CRUD endpoints.
-
Use advanced-alchemy-litestar , advanced-alchemy-fastapi , or advanced-alchemy-flask for framework DI and request handling.
Advanced Alchemy References