📊 Capítulo 06: Sessões Assíncronas & CRUD
Especialização Backend com Java 21 & Python FastAPI
🗺️ O Fluxo Assíncrono com AsyncEngine & AsyncSession
sequenceDiagram
autonumber
actor C as Cliente HTTP
participant R as Endpoint (@router.get)
participant S as AsyncSession (SQLAlchemy / SQLModel)
participant E as AsyncEngine (Pool de Conexões)
participant PG as PostgreSQL (Driver asyncpg)
C->>R: GET /api/v1/produtos?limite=10
R->>S: await session.exec(select(Produto).limit(10))
S->>E: Adquire conexão assíncrona do pool
E->>PG: Envia query binária não-bloqueante sobre TCP
Note over R,PG: O Event Loop do Python fica livre para atender outras 5.000 requisições!
PG-->>E: Retorna Tuplas do Banco
E-->>S: Converte em instâncias de Produto
S-->>R: Retorna Lista de Entidades
R-->>C: Retorna HTTP 200 JSON
🎯 Slide 1: Configuração do AsyncEngine com asyncpg
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker
from sqlmodel import SQLModel
DATABASE_URL = "postgresql+asyncpg://user:pass@localhost:5432/ecommerce_db"
async_engine = create_async_engine(
DATABASE_URL,
echo=False,
pool_size=20,
max_overflow=10,
pool_pre_ping=True
)
async_session_factory = async_sessionmaker(
bind=async_engine,
class_=AsyncSession,
expire_on_commit=False
)
🎯 Slide 2: Operações de CRUD Assíncronas Modernas
# Create
session.add(novo_produto)
await session.commit()
await session.refresh(novo_produto)
# Read (Select com filtro)
statement = select(Produto).where(Produto.id == produto_id)
result = await session.exec(statement)
produto = result.first()
# Delete
await session.delete(produto)
await session.commit()
🎯 Slide 3: Por Que Usar expire_on_commit=False?
- Prevenção de
MissingGreenlet/DetachedInstanceError: No modo assíncrono, se o Hibernate/SQLAlchemy tentar recarregar atributos de um objeto após ocommit()fora de um blocoawait, ele disparará uma exceção crítica!
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim