Async SQLAlchemy 2.0 & AsyncSession Architecture
1Concept
Async SQLAlchemy integrates with Python's `asyncio` event loop using `create_async_engine()` and `AsyncSession`, running asynchronous queries over non-blocking database drivers like `asyncpg`.
2Architecture Diagram
Client ---> async with AsyncSession(engine) as session:
result = await session.execute(select(User))
users = result.scalars().all()3Code Example
Python 3.12
async_architecture_sample = '''
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy import select
engine = create_async_engine("postgresql+asyncpg://user:pass@localhost/db")
async_session = async_sessionmaker(engine, expire_on_commit=False)
async def get_users():
async with async_session() as session:
result = await session.execute(select(Account))
return result.scalars().all()
'''
print("=== Async SQLAlchemy 2.0 Pipeline ===")
print(async_architecture_sample.strip())4Expected Output
=== Async SQLAlchemy 2.0 Pipeline ===
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy import select
engine = create_async_engine("postgresql+asyncpg://user:pass@localhost/db")
async_session = async_sessionmaker(engine, expire_on_commit=False)
async def get_users():
async with async_session() as session:
result = await session.execute(select(Account))
return result.scalars().all()5Key Takeaways
- ✓Use `expire_on_commit=False` to access model attributes after session commit without lazy-loading crashes.
- ✓Async engine requires an async DB driver (e.g. `asyncpg` for PostgreSQL, `aiosqlite` for SQLite).
- ✓Lazy loading attributes outside of an async session throws `MissingGreenlet` error.