Queries
Construcción
Sección titulada «Construcción»jsorm usa una forma estructurada de query JSON en lugar de builders encadenados.
const rows = await db.get(User, { select: { id: true, name: true, role: { name: true }, _count: true, }, where: { AND: [ { active: true }, { role: { name: { eq: 'admin' } } }, ], }, orderBy: [{ createdAt: 'desc' }],});Cuando omites pagination, get() aplica un LIMIT 150 por defecto para evitar lecturas masivas accidentales. Puedes sobreescribir con JSORM_LIMIT_DEFAULT.
Operadores escalares en where
Sección titulada «Operadores escalares en where»| Operador | Comportamiento |
|---|---|
{ eq: value } | Igual |
{ ne: value } | Distinto |
{ gt: value } | Mayor que |
{ gte: value } | Mayor o igual |
{ lt: value } | Menor que |
{ lte: value } | Menor o igual |
{ in: [...] } | Valor dentro de lista |
{ contains: string } | LIKE %value% |
{ startsWith: string } | LIKE value% |
{ endsWith: string } | LIKE %value |
Operadores lógicos
Sección titulada «Operadores lógicos»const rows = await db.get(User, { select: { id: true, name: true }, where: { OR: [ { email: { contains: '@corp.com' } }, { role: { name: { eq: 'admin' } } }, ], },});Paginación por cursor
Sección titulada «Paginación por cursor»const page = await db.get(User, { select: { id: true, name: true }, orderBy: [{ id: 'asc' }], cursor: { after: '...token-base64url-opaco...', take: 25, },});// page.pageInfo: { hasNextPage, hasPreviousPage, startCursor, endCursor }Reglas de cursor:
- El modo
cursorrequiereorderBy - jsorm agrega automáticamente un tie-breaker por clave primaria cuando hace falta
cursor.takese limita porJSORM_CURSOR_HARD_MAX_LIMIT(default1000)
Insert / update / delete
Sección titulada «Insert / update / delete»await db.insert(User, { name: 'Alice', createdAt: new Date(), role: { connect: 1 },});
await db.update(User, { data: { active: false }, where: { id: { eq: 10 } },});
await db.delete(User, { where: { id: { eq: 10 } },});Mutaciones de relaciones
Sección titulada «Mutaciones de relaciones»await db.insert(User, { name: 'Bob', createdAt: new Date(), roles: [1, 2],});
await db.update(User, { data: { roles: { connect: [3], disconnect: [1] }, }, where: { id: { eq: 5 } },});SQL raw
Sección titulada «SQL raw»Usa solo el escape hatch documentado:
const rows = await db.raw.execute( 'SELECT id, name FROM users WHERE active = $1 AND created_at > $2', [true, new Date('2024-01-01')],);
const compiled = await db.raw.compile( 'SELECT id, name FROM users WHERE active = $1', [true],);Buenas prácticas
Sección titulada «Buenas prácticas»- Mantén
whereexplícito en todas las escrituras. - Prefiere filtros de relación anidados sobre SQL manual con joins.
- Usa
orderByjunto con paginación para endpoints estables. - Usa paginación por
cursorpara datasets grandes o scroll infinito. - Reserva
db.raw.*para queries que el DSL JSON no puede expresar limpiamente.