Phase 17 of 25 · Topic 17.3

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.