async sqlmodel

This commit is contained in:
John Lancaster
2026-06-26 00:53:18 -05:00
parent 0177496fab
commit eeeb6ecdbe
4 changed files with 152 additions and 3 deletions
@@ -57,7 +57,7 @@ async def get_db_session(
session_factory: async_sessionmaker[AsyncSession] = Depends(get_session_factory),
) -> AsyncIterator[AsyncSession]:
async with session_factory() as session:
yield session
yield session
```
Route usage:
@@ -72,8 +72,8 @@ router = APIRouter()
@router.post("/items")
async def create_item(session: AsyncSession = Depends(get_db_session)) -> dict:
async with session.begin():
# write operations here
...
# write operations here
...
return {"status": "ok"}
```
@@ -98,6 +98,12 @@ Notes:
- `expire_on_commit=False` is commonly preferred in asyncio applications to reduce accidental post-commit reload behavior.
- `AsyncSession.refresh()` is preferred over broad expiration patterns when state refresh is needed.
## SQLModel Alignment
- If using SQLModel, keep the same session ownership model: one `async_sessionmaker`, one `AsyncSession` per request/unit-of-work.
- SQLModel does not replace SQLAlchemy async lifecycle primitives; it complements model declaration and typed data handling.
- During migration, avoid mixed ad hoc patterns where some handlers create SQLAlchemy sessions directly while others use SQLModel-specific wrappers.
---
## Concurrency Rules