SQLModel Integration¶
Advanced Alchemy provides built-in compatibility for SQLModel, allowing you to use SQLModel’s elegant syntax for defining models while leveraging Advanced Alchemy’s powerful repositories and services.
Basic Setup¶
To use SQLModel with Advanced Alchemy, ensure your models are defined with table=True.
from typing import Optional
from sqlmodel import Field, SQLModel
from advanced_alchemy.repository import SQLAlchemyAsyncRepository
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None
class HeroRepository(SQLAlchemyAsyncRepository[Hero]):
model_type = Hero
from sqlmodel import Field, SQLModel
from advanced_alchemy.repository import SQLAlchemyAsyncRepository
class Hero(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
secret_name: str
age: int | None = None
class HeroRepository(SQLAlchemyAsyncRepository[Hero]):
model_type = Hero
Usage with Repositories¶
Repositories automatically detect SQLModel classes and handle them correctly during CRUD operations.
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
async def create_and_list_heroes() -> list[Hero]:
engine = create_async_engine("sqlite+aiosqlite:///:memory:")
async_session_factory = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
async with engine.begin() as conn:
await conn.run_sync(SQLModel.metadata.create_all)
try:
async with async_session_factory() as session:
repo = HeroRepository(session=session)
hero = Hero(name="Deadpond", secret_name="Dive Wilson")
await repo.add(hero)
await session.commit()
return await repo.list()
finally:
await engine.dispose()
Limitations¶
While SQLModel is supported, some Advanced Alchemy features that rely on specific SQLAlchemy base class behaviors (like some automated mixin detections) may require explicit configuration when used with SQLModel.