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
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 operationsRemoving a database
cleanup.ts
// Unregister a database when no longer needed
orm.removeDatabase('analytics');
// All connections are cleaned upRaw 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 rowCountModel 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