SlintORM
Docsnpm

Database Resolver

SlintORM's database resolver lets you manage multiple database connections from a single ORM instance. Add named databases, route models to them, and execute raw SQL on any connection.

API Reference

MethodDescription
orm.addDatabase(name, config)Register a named database connection.
orm.resolveDb(name)Get the underlying database adapter for a name.
orm.removeDatabase(name)Unregister a database and clean up connections.
orm.execOn(name, sql, params?)Execute raw SQL on a named database.
model.useDb(name)Create a model instance bound to a specific database.

Adding databases

db.ts
// Register multiple named databases
import ORMManager from 'slintorm';

const orm = new ORMManager({
  driver: 'sqlite',
  databaseUrl: './primary.db',
});

// Add a secondary analytics database
orm.addDatabase('analytics', {
  driver: 'sqlite',
  databaseUrl: './analytics.db',
});

// Add a Postgres reporting database
orm.addDatabase('reporting', {
  driver: 'postgres',
  databaseUrl: process.env.PG_REPORTING_URL!,
});

Resolving a database adapter

example.ts
// Get the raw database adapter for a named database
const db = orm.resolveDb('analytics');
// db is the driver-specific adapter instance
// Use it for low-level operations

Removing a database

cleanup.ts
// Unregister a database when no longer needed
orm.removeDatabase('analytics');
// All connections are cleaned up

Raw SQL execution

queries.ts
// Execute raw SQL on a named database
const users = await orm.execOn('reporting', 'SELECT * FROM users WHERE active = ?', [true]);
// Returns SQLExecResult with columns, rows, and rowCount

Model routing with useDb

routing.ts
// Route a model to a specific database
import { orm } from './db';

// Define the model normally (uses default database)
const User = orm.defineModel<User>('users', 'User');

// Create an instance bound to a different database
const AnalyticsUser = User.useDb('analytics');

// Now queries on AnalyticsUser run against 'analytics' database
const localUsers = await User.findAll();
const analyticsUsers = await AnalyticsUser.findAll();

Use cases

Multi-tenant databases

Route each tenant to their own database for strict data isolation.

multi-tenant.ts
// Multi-tenant routing — one database per tenant
const databases = ['tenant_a', 'tenant_b', 'tenant_c'];

for (const tenant of databases) {
  orm.addDatabase(tenant, {
    driver: 'postgres',
    databaseUrl: process.env[tenant.toUpperCase() + '_URL']!,
  });
}

async function getUsersForTenant(tenantId: string) {
  const TenantBoundUser = orm.db.User.useDb(tenantId);
  return TenantBoundUser.findAll();
}

Read/write splitting

Send writes to a primary database and reads to a replica.

read-write-split.ts
// Read/write splitting
orm.addDatabase('primary', {
  driver: 'postgres',
  databaseUrl: process.env.PG_WRITER_URL!,
});

orm.addDatabase('replica', {
  driver: 'postgres',
  databaseUrl: process.env.PG_READER_URL!,
});

const User = orm.defineModel<User>('users', 'User');
const UserRead = User.useDb('replica');

// Writes go to primary, reads go to replica
await User.insert({ name: 'Alice' });        // primary
const users = await UserRead.findAll();       // replica
PreviousContext & Prepared StatementsNextUpcoming Features