Ir al contenido

Adaptadores

jsorm mantiene el acceso a base de datos fuera del núcleo del ORM. Tú eliges el adaptador según dónde corre tu código:

  • Adaptadores nativos (@jsorm/pg, @jsorm/mysql, @jsorm/sqlite) para runtimes Node/Bun con acceso directo a la base de datos.
  • Adaptador fetch (@jsorm/fetch) para runtimes edge o fetch-only que no pueden abrir sockets TCP ni ejecutar binarios nativos.

Usa @jsorm/node para el CLI y para los flujos de deploy/migraciones en producción, incluso si tu app usa @jsorm/runtime + @jsorm/fetch.

PaqueteTipoMejor para
@jsorm/pgAdaptador nativo TCPPostgreSQL en servicios Node, workers, CI y deploy jobs
@jsorm/mysqlAdaptador nativo TCPTargets MySQL como PlanetScale desde Node
@jsorm/sqliteAdaptador nativo in-processArchivos SQLite locales, apps embebidas, tests y tooling
@jsorm/fetchAdaptador HTTP/fetchVercel Edge, Cloudflare Workers y otros runtimes fetch-only
Runtime / flujoAdaptadores nativos@jsorm/fetchOpción recomendada
Servidor Node.jsPrioriza adaptadores nativos
Servicio/runtime BunPrioriza adaptadores nativos si hay acceso directo a DB
Runtime DenoSolo SQLitePrioriza fetch salvo que uses SQLite explícitamente
Vercel Edge / Cloudflare Workers / Netlify EdgeNoUsa @jsorm/runtime + @jsorm/fetch
CLI, migraciones, jsorm deployNoUsa @jsorm/node + adaptador nativo
  • tu runtime puede abrir conexiones directas a PostgreSQL/MySQL
  • ejecutas servicios Node o Bun de larga vida
  • quieres el camino por defecto para jsorm deploy
  • tu job de deploy o CI es dueño de las migraciones
  • tu runtime es edge-only o fetch-only
  • no puedes abrir sockets TCP desde handlers de request
  • puedes exponer un gateway HTTP SQL que jsorm consuma
  • mantienes migraciones y checks de deploy en un release step Node separado
import { createJsorm, defineConnectionSource, defineJsormConfig } from '@jsorm/core';
import { pgAdapter } from '@jsorm/pg';
const main = defineConnectionSource({
adapter: pgAdapter({
name: 'main',
connectionString: process.env.DATABASE_URL!,
pool: { min: 2, max: 10 },
}),
});
export default defineJsormConfig({
connectionSources: { main },
defaults: { connectionSource: 'main' },
});
export const db = await createJsorm().init();

Usa imports runtime-safe en bundles edge:

import { createJsorm, defineConnectionSource, defineJsormConfig } from '@jsorm/runtime';
import { fetchAdapter } from '@jsorm/fetch';
const main = defineConnectionSource({
adapter: fetchAdapter({
name: 'main',
dialect: 'postgres',
endpoint: process.env.SQL_HTTP_ENDPOINT!,
headers: () => ({
authorization: `Bearer ${process.env.SQL_HTTP_TOKEN!}`,
}),
}),
});
export default defineJsormConfig({
connectionSources: { main },
defaults: { connectionSource: 'main' },
});
export const db = await createJsorm().init();
EntornoRuntime de appAdaptadorNota de producción
API / worker / queue en Node@jsorm/core o @jsorm/nodeNativoMejor opción por defecto para acceso directo y release jobs
Vercel Edge@jsorm/runtime@jsorm/fetchMantén jsorm deploy en GitHub Actions u otro paso Node
Cloudflare Workers@jsorm/runtime@jsorm/fetchApunta el adaptador a un endpoint HTTP SQL que controles
Docker / job de deploy en CI@jsorm/nodeNativoEjecuta pnpm exec jsorm deploy --strict --verbose antes del rollout

Usa health checks a nivel de adaptador en código runtime:

const health = await db.healthCheck();
// { main: 'ok', analytics: 'ok' }

Y en flujos Node de deploy o readiness:

Ventana de terminal
pnpm exec jsorm db:check
  • Los adaptadores nativos son la opción por defecto para checks previos al deploy.
  • Los adaptadores fetch también pueden participar en db.healthCheck(), pero tu endpoint HTTP debe estar accesible, autenticado y sano.

Las transacciones tienen scope de una sola connection source:

await db.transaction(async (tx) => {
await tx.insert(User, {
name: 'Alice',
createdAt: new Date(),
});
});
  • Los adaptadores nativos soportan transacciones de una sola base de datos de forma directa.
  • @jsorm/fetch también soporta transacciones, pero tu endpoint HTTP SQL debe implementar begin, commit y rollback.
  • No se soportan transacciones cross-database.

jsorm permite registrar múltiples connectionSources para separar lecturas/escrituras o conectarse a distintas bases de datos. Usa db.use(name) para obtener un cliente ligero con un scope específico, o db.with(name, fn) para aislar operaciones dentro de un bloque.

import { createJsorm, defineConnectionSource, defineJsormConfig } from '@jsorm/core';
import { pgAdapter } from '@jsorm/pg';
const main = defineConnectionSource({ /* ... */ });
const analytics = defineConnectionSource({ /* ... */ });
export default defineJsormConfig({
connectionSources: { main, analytics },
defaults: { connectionSource: 'main' },
});
export const db = await createJsorm().init();
// Usa la conexión 'main' por defecto
await db.get(User, { select: { id: true } });
// Cliente con scope para la conexión 'analytics'
const analyticsDb = db.use("analytics");
await analyticsDb.get(User, { select: { id: true } });
// Bloque con scope
await db.with("analytics", async (scoped) => {
await scoped.raw.execute("SELECT 1");
});
  1. App Node en producción por defecto: adaptador nativo.
  2. Path de requests en edge: @jsorm/runtime + @jsorm/fetch.
  3. Migraciones y deploy: @jsorm/node + adaptador nativo.
  4. SQLite local embebido: @jsorm/sqlite.