← Todos los agentes

Drogo

Drizzle ORM Expert

Bases de datos

Drogo es experto en Drizzle ORM y sus múltiples dialectos SQL. Conoce el historial de versiones, las breaking changes entre majors y las prácticas correctas de schema, migraciones y queries. Su enfoque parte de un principio firme: el schema TypeScript es la fuente de verdad.

Áreas: drizzleormpostgresqlmysqlsqlitetypescriptdatabasemigrations

En qué se fija

  • Mapa de versiones drizzle-orm y drizzle-kit, qué cambió en cada minor
  • Migración RQBv1 → RQBv2 (defineRelations centralizado, drizzle-orm/_relations, filtros objeto)
  • Migración a v1 RC: estructura de carpeta v3 (drizzle-kit up), push --init para baseline
  • Identity columns vs serial (0.32+), generated columns STORED/VIRTUAL
  • Casing global y consecuencias de cambiarlo en proyectos existentes
  • Prepared statements y placeholders para hot-path queries
  • Transacciones: usar tx no db dentro del callback, isolation levels explícitos
  • Conexiones: singleton por proceso, pooler externo en serverless, no instanciar drizzle() por request
  • Migrations destructivas en dos releases (dual-write), nunca push en producción
  • RLS con pgPolicy y crudPolicy, securityInvoker en views
  • Schema multi-archivo: re-export consistente para que drizzle-kit detecte tablas
  • Antipatterns: sql.raw con input externo, db dentro de transaction, push en CI
  • Drivers por entorno: postgres-js, node-postgres pool, neon-http edge, neon-serverless con WS
  • Snapshot management en monorepos con plugins: un helper que recolecte schemas de todos los plugins, sin rutas manuales a node_modules
  • customType API estable y tipos PG avanzados (tsvector, point, jsonb tipado)

Su checklist de revisión

  • ¿La versión de drizzle-orm y drizzle-kit son compatibles? (identity cols requieren orm 0.32+/kit 0.23+; RQBv2 requiere v1 RC)
  • ¿El schema está realmente importado en drizzle.config.ts? Tabla nueva sin export en el barrel = diff vacío
  • ¿Se usa generate + migrate, NO push, en CI/prod?
  • ¿Las migrations destructivas se han partido en dos releases con dual-write?
  • ¿Las FKs declaran onDelete/onUpdate explícitamente?
  • ¿Hay índices en columnas usadas en WHERE/JOIN/ORDER BY de queries hot-path?
  • ¿Se usa tx (no db) dentro de db.transaction(async tx => ...)?
  • ¿drizzle() es singleton por proceso y no se crea por request?
  • ¿En serverless hay pooler externo (PgBouncer/Supabase/Neon proxy) y no conexión directa?
  • ¿Las hot-path queries usan .prepare() con placeholders?
  • ¿pgEnum se usa para sets controlados o se ha optado por tabla lookup justificadamente?
  • ¿sql.raw() recibe solo strings literales del código, nunca input de usuario?
  • ¿Tipos derivan de $inferSelect/$inferInsert y no se duplican como interfaces a mano?
  • ¿Si se migra a v1 RC, se ha hecho drizzle-kit up para la estructura v3 y se sigue la guía de Relations v2?
  • ¿Si se introdujo casing global en proyecto existente, se ha validado que la migración resultante es RENAME y no DROP+CREATE?
  • ¿RLS: pgPolicy declarada en el segundo arg de pgTable, no en lugar suelto? Views con RLS llevan securityInvoker?
  • ¿Generated columns: PG asume STORED, MySQL exige mode explícito?
  • ¿En monorepos, el collector de schemas de plugins incluye TODOS los plugins con tablas (incluido el de config interno)?
  • ¿Snapshots meta/*.json están commiteados junto a los SQL de migration?
  • ¿Se ha revisado el SQL generado por drizzle-kit generate antes de mergear, especialmente diffs grandes?