litestar
免费Auto-activate for Litestar, Controller, Router, @get/@post, FromPath, MsgspecDTO, OpenAPIConfig, Provide, FromDishka, Guard, ASGIMiddleware, HTTPException, ChannelsPlugin, or WebSocket. Not for standalone libs.
中文简介正在准备中。当前显示原文说明。
Auto-activate for advanced_alchemy, alembic/, SQLAlchemyAsyncRepositoryService, SQLAlchemyAsyncConfig, repository_type, service_class, filters, or storage. Not for raw SQLAlchemy — use sqlspec.
中文简介正在准备中。当前显示原文说明。
安装前可以查看交给 AI 代理的指令内容。
Mapped[...] for columns and T | None for optional fields.Repo service pattern and advanced_alchemy.* imports.from __future__ import annotations when it matches the project; 1.12
supports it in model modules.advanced-alchemy ships first-party extensions for five web frameworks. If your project uses one of these, jump directly to the matching integration guide and skip the others:
SQLAlchemyPlugin with full DI, session store, CLI. The rest of this SKILL.md covers Litestar by default; also see references/litestar_plugin.md.references/fastapi-integration.md — AdvancedAlchemy(config=..., app=app), Depends(alchemy.provide_session()) DI, provide_service()/provide_filters(), Alembic CLI via assign_cli_group.references/flask-integration.md — AdvancedAlchemy(config=..., app=app) or init_app() factory, pull-based alchemy.get_sync_session(), async-via-portal.references/sanic-integration.md — AdvancedAlchemy(sqlalchemy_config=..., sanic_app=app) (note: sqlalchemy_config= kwarg, not config=), sanic-ext DI, request.ctx sessions.references/starlette-integration.md — AdvancedAlchemy(config=..., app=app), request.state session access, lifespan wrapping.Transaction configuration is framework-specific. Litestar uses
before_send_handler; FastAPI, Flask, Starlette, and Sanic use
commit_mode="manual", "autocommit", or
"autocommit_include_redirect". Read the matching framework guide, then
references/commit-modes.md and
references/multi-database.md.
The rest of this SKILL.md covers framework-agnostic topics: base classes, repositories, services, filters, custom types, caching, replicas, operations, and Alembic migrations.
Advanced Alchemy is NOT a raw ORM — it is a service/repository layer built on top of SQLAlchemy 2.0+ with opinionated base classes, audit mixins, and deep framework integrations (Litestar, FastAPI, Flask, Starlette, Sanic). It provides:
id, created_at, updated_at fieldsto_model_on_create, to_model_on_update, to_model_on_upsert, to_model_on_delete)EncryptedString, EncryptedText, PasswordHash, FileObject, StoredObject, DateTimeUTC, GUID, Bool, JsonB, Vector, TOTPSecret, OneTimeCode| Base Class | PK Type | Audit Columns | When to Use |
|---|---|---|---|
UUIDAuditBase | UUID v4 | created_at, updated_at | Default choice for most models |
UUIDBase | UUID v4 | None | Lookup tables, tags, no audit needed |
UUIDv7AuditBase / UUIDv7Base | UUID v7 | created_at, updated_at / None | Time-ordered IDs when uuid-utils is installed or Python supplies UUIDv7 |
UUIDv6AuditBase / UUIDv6Base | UUID v6 | created_at, updated_at / None | Time-ordered UUIDv6 IDs |
BigIntAuditBase / BigIntBase | BigInt auto-increment | created_at, updated_at / None | Legacy systems, integer PKs |
NanoIDAuditBase / NanoIDBase | NanoID string | created_at, updated_at / None | URL-friendly short IDs |
IdentityAuditBase / IdentityBase | database identity | created_at, updated_at / None | Native IDENTITY columns |
DefaultBase | None (define yourself) | None | Custom or composite primary keys with AA table naming |
SQLQuery | None | None | Custom mapped read-only SQL query projections |
| Repository | Purpose |
|---|---|
SQLAlchemyAsyncRepository[Model] / SQLAlchemySyncRepository[Model] | Standard async/sync CRUD |
SQLAlchemyAsyncSlugRepository[Model] / SQLAlchemySyncSlugRepository[Model] | CRUD + slug generation helpers |
SQLAlchemyAsyncQueryRepository / SQLAlchemySyncQueryRepository | Complex read-only queries (no model_type) |
| Service | Purpose |
|---|---|
SQLAlchemyAsyncRepositoryService[Model] / SQLAlchemySyncRepositoryService[Model] | Full CRUD with lifecycle hooks |
SQLAlchemyAsyncRepositoryReadService[Model] / SQLAlchemySyncRepositoryReadService[Model] | Read-only (get_many, get, count, exists) |
SQLAlchemyAsyncQueryService / SQLAlchemySyncQueryService | Service wrapper around arbitrary SQL queries |
Key lifecycle hooks: to_model_on_create, to_model_on_update, to_model_on_upsert, to_model_on_delete.
| Type | Purpose | Notes |
|---|---|---|
FileObject / StoredObject | Object storage with lifecycle hooks | Tracks file state across session; auto-deletes on row delete via StoredObject tracker; use FileObjectList for multi-file JSON arrays |
PasswordHash | Hashed password storage | Supports Argon2, Passlib, and Pwdlib backends; returns HashedPassword with .verify() and .verify_and_update() |
EncryptedString / EncryptedText | Transparent encryption at rest | Supports FernetBackend (client-side) and PGCryptoBackend (server-side); pass a stable key explicitly |
GUID | Cross-dialect UUID column | Native UUID on PostgreSQL/DuckDB/CockroachDB, BINARY(16) or CHAR(32) fallback elsewhere; pair with UUIDv7AuditBase / UUIDv6AuditBase for time-sortable UUIDs |
DateTimeUTC | Timezone-aware UTC datetime | Stores as UTC; normalizes or raises on naive datetimes |
Bool | Dialect-aware boolean | Uses Oracle 23ai native BOOLEAN when SQLAlchemy exposes it; falls back to stock SQLAlchemy Boolean |
JsonB | Dialect-aware JSON / JSONB | Uses JSONB on PostgreSQL/CockroachDB, JSON on other backends, BLOB with OSON on Oracle |
Vector | Dialect-aware vector storage and distance operators | Oracle 23ai VECTOR, PostgreSQL/CockroachDB pgvector, JSON fallback without distance operators |
TOTPSecret / OneTimeCode | MFA and single-use code storage | TOTPSecret encrypts shared secrets and returns TOTPProvider; OneTimeCode hashes codes with TTL/attempt tracking and returns HashedOneTimeCode |
SQLAlchemyAsyncRepositoryService is the primary service base class. Key behaviors:
dict to create(), update(), upsert() — the service converts via to_model_on_create / to_model_on_update lifecycle hooks before persistencecreate_many(data), update_many(data), upsert_many(data, match_fields=..., no_merge=False, chunk_size=None), delete_many(item_ids) — batched in a single transaction; upsert_many() dispatches to native dialect primitives (ON CONFLICT, ON DUPLICATE KEY UPDATE, MERGE, Spanner INSERT OR UPDATE) via resolve_upsert_strategy() when uniqueness is provable, and delete_many() accepts raw primary keys, composite-key tuples/dicts, model instances, or mixed liststo_model_on_create, to_model_on_update, to_model_on_upsert — override to transform input data, hash passwords, normalize strings, etc.| Mixin | Fields Added | When to Use |
|---|---|---|
AuditColumns | created_at, updated_at | Add timestamps to a model with a custom primary key |
SlugKey | unique slug column | Pair with a slug repository; the mixin does not generate values |
UniqueMixin | as_unique_async() / as_unique_sync() | Session-cached select-or-create after defining unique_hash() and unique_filter() |
SentinelMixin | hidden sa_orm_sentinel column | Deterministic ordering for SQLAlchemy bulk inserts; not optimistic locking |
Use SQLAlchemyPlugin (composite of SQLAlchemyInitPlugin + SQLAlchemySerializationPlugin) for full integration:
SQLAlchemyPlugin: registers engine/session providers, a Litestar
before_send hook, and ORM type encoders in one callSQLAlchemyDTO: generates Litestar DTOs directly from ORM models with include/exclude field controldatetime, UUID, Decimal, Enum, and custom column typesset_default_exception_handler=True (the default)
registers RepositoryError: exception_to_http_response on the app — unless
Litestar(exception_handlers={...}) contains any integer status-code key
(500, 404, etc.), in which case SQLAlchemyInitPlugin skips default
registration and you must register RepositoryError: exception_to_http_response
explicitlyChoose the appropriate base class from the quick reference table. Use UUIDAuditBase unless you have a specific reason not to. Define columns with Mapped[] typing.
Create a repository class with model_type set to your model. Use SQLAlchemyAsyncRepository for standard CRUD, SQLAlchemyAsyncSlugRepository if the model uses SlugKey.
Create a service class with an inner Repo class. Set match_fields for upsert logic. Add lifecycle hooks (to_model_on_create, to_model_on_update) for business logic transformations.
Use the framework plugin (Litestar, FastAPI, Flask, Sanic) to inject sessions and register the service as a dependency.
With Litestar, run litestar database make-migrations -m "description" and
then litestar database upgrade. With the standalone CLI, put the required
config option before the command:
alchemy --config path.to.config make-migrations -m "description".
match_fields on services that use upsert() to avoid duplicate-key errorsschema_dump() / schema_dump_config for explicit dump behavior — services already convert Pydantic/msgspec/attrs/dataclass inputs during model conversionUUIDAuditBase as default base class — only deviate when you have a concrete reasonadvanced_alchemy.* imports — the old litestar.plugins.sqlalchemy paths are deprecatedEncryptedString and EncryptedText. Omitting
key= emits a 1.11 deprecation warning and produces data that cannot survive
a process restart.get_many() and get_many_and_count(). list() and
list_and_count() are deprecated until 2.0.RepositoryError: exception_to_http_response when using integer status-code exception_handlers in Litestar. SQLAlchemyInitPlugin skips its default RepositoryError handler whenever any int key (500, 404, etc.) is present in Litestar(exception_handlers={...}).Before delivering code, verify:
DeclarativeBase from SQLAlchemy)Mapped[] type annotationsRepo class with model_type setadvanced_alchemy.*, not deprecated pathsget_many() / get_many_and_count(), not deprecated list aliasesA complete Tag entity with model, repository, and service:
"""Tag domain — model, repository, and service."""
from advanced_alchemy.base import UUIDAuditBase
from advanced_alchemy.repository import SQLAlchemyAsyncRepository
from advanced_alchemy.service import ModelDictT, SQLAlchemyAsyncRepositoryService
from sqlalchemy.orm import Mapped, mapped_column
class Tag(UUIDAuditBase):
"""Tag model with audit trail."""
__tablename__ = "tag"
name: Mapped[str] = mapped_column(unique=True)
description: Mapped[str | None] = mapped_column(default=None)
class TagRepository(SQLAlchemyAsyncRepository[Tag]):
"""Data access for tags."""
model_type = Tag
class TagService(SQLAlchemyAsyncRepositoryService[Tag]):
"""Business logic for tags."""
class Repo(SQLAlchemyAsyncRepository[Tag]):
model_type = Tag
repository_type = Repo
match_fields = ["name"]
async def to_model_on_create(self, data: ModelDictT[Tag]) -> ModelDictT[Tag]:
"""Normalize tag name before creation."""
if isinstance(data, dict) and "name" in data:
data["name"] = data["name"].strip().lower()
return data
</example>
Choosing between
advanced-alchemyandsqlspec:advanced-alchemy(this skill) gives you an opinionated ORM service layer withUUIDAuditBase, lifecycle hooks, repository / service / Alembic integration, andOffsetPagination[T]out of the box — pick it when you want a complete CRUD surface with attribute-style row access and you're happy inside the SQLAlchemy ecosystem.sqlspecgives you direct SQL control, 15+ driver adapters (asyncpg, oracledb, DuckDB, BigQuery, SQLite, and more), Arrow-native result streams for analytics, and a builder API when you need it — pick it when you want explicit SQL, heterogeneous database backends, or Arrow integration. Both skills integrate with Litestar via first-party plugins; see../sqlspec/SKILL.mdfor the raw-SQL / multi-adapter path.
For detailed guides and code examples, refer to the following documents in references/:
OnConflictUpsert (single-row + bulk create_upsert_many / create_merge_many / create_insert_or_update_many), MergeStatement (PostgreSQL 15+ / Oracle / MSSQL), resolve_upsert_strategy, session event listeners (FileObject, cache invalidation, touch_updated_timestamp), and the msgspec-first encode_json / decode_json used across the library.还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Auto-activate for Litestar, Controller, Router, @get/@post, FromPath, MsgspecDTO, OpenAPIConfig, Provide, FromDishka, Guard, ASGIMiddleware, HTTPException, ChannelsPlugin, or WebSocket. Not for standalone libs.
中文简介正在准备中。当前显示原文说明。
Auto-activate for Google ADK, LlmAgent, Runner, SQLSpecSessionService, google-genai, AgentRuntime, AgentGroup, SpecTree, DynamicWorkflow, FunctionTool, or SSE agent chats. Not for offline ML training.
中文简介正在准备中。当前显示原文说明。
Auto-activate for litestar_autowire, AutowirePlugin, AutowireConfig, domain_packages, AutowireIntegration, AutowireLoader, or clear_autowire_cache. Not for manual Router composition — use explicit routes.
中文简介正在准备中。当前显示原文说明。
Auto-activate for uv build, hatch build, PyApp, PYAPP_*, wheel assets, GitHub release matrices, cargo-zigbuild, or python-build-standalone. Not for runtime deployment.
中文简介正在准备中。当前显示原文说明。
Auto-activate for Dockerfile, compose, Railway, Cloud Run, GKE, systemd, Kubernetes, Terraform, deploy scripts, or granian/litestar run at runtime. Not for packaging artifacts.
中文简介正在准备中。当前显示原文说明。
Auto-activate for litestar_email, EmailPlugin, EmailConfig, EmailService, EmailMessage, SMTPConfig, ResendConfig, SendGridConfig, MailgunConfig, SESConfig. Not for marketing APIs — use vendor SDKs.
中文简介正在准备中。当前显示原文说明。