SKILL.md
postgresqlsqlalchemyasync
SQLAlchemy 2.0 en modo async es el ORM principal para todas las operaciones de base de datos. Se integra nativamente con FastAPI y asyncio, garantizando que las escrituras de auditoría no bloquean el pipeline KYC.
When to use
Usar para todas las operaciones CRUD sobre PostgreSQL: insertar sesiones de auditoría, consultar listas negras, registrar decisiones, gestionar la cola de revisión manual.
Instructions
- Instalar:
pip install sqlalchemy[asyncio] asyncpg alembic - Configurar engine async en
backend/db/engine.py:
``python from sqlalchemy.ext.asyncio import createasyncengine, AsyncSession from sqlalchemy.orm import sessionmaker engine = createasyncengine("postgresql+asyncpg://user:pass@pgbouncer:5432/kyc", poolsize=20) AsyncSessionLocal = sessionmaker(engine, class=AsyncSession, expireoncommit=False) ``
- Definir modelos en
backend/db/models/:
- AuditSession: sessionid, useridhash, decision, globalscore, agentscores (JSONB), integrityhash, createdat. - BlacklistedDocument: docnumberhash, doctype, country, reason, createdat. - ManualReviewQueue: sessionid, reason, status, assignedto, createdat.
- Inyectar sesión DB en FastAPI via dependency:
async with AsyncSessionLocal() as session. - Usar
session.add()+await session.commit()— nunca commits síncronos. - Gestionar migraciones con Alembic:
alembic upgrade headen el init del contenedor. - Conectar siempre a través de PgBouncer (puerto 5432) — nunca directo al puerto 5433 de PostgreSQL.
Notes
expireoncommit=Falsees obligatorio en async para evitar lazy loading tras el commit.- Los INSERTs de auditoría deben ser fire-and-forget: usar
asyncio.create_task()para no bloquear la respuesta al cliente. - Nunca almacenar embeddings faciales en PostgreSQL — usar MinIO con TTL corto.