Database Drivers
Configuration reference for supported database drivers
Database Drivers
ObjectStack supports multiple database backends through a unified driver interface. Drivers can be selected in two ways:
-
Env var only — auto-inferred from the URL scheme (the simplest path):
export OS_DATABASE_URL=mongodb://localhost:27017/myapp # → MongoDB export OS_DATABASE_URL=postgres://user:pass@host/db # → PostgreSQL export OS_DATABASE_URL=mysql://user:pass@host/db # → MySQL export OS_DATABASE_URL=libsql://mydb.turso.io # → Turso / libSQL export OS_DATABASE_URL=file:./data/app.db # → SQLite pnpm devThe CLI inspects the connection-string scheme and picks the right driver automatically. You only need to set
OS_DATABASE_DRIVERwhen you want to override the inference (e.g. forcesqlitefor an ambiguous path). -
Programmatic in
objectstack.config.ts:import { defineStack } from '@objectstack/spec'; import { SqlDriver } from '@objectstack/driver-sql'; export default defineStack({ manifest: { /* ... */ }, driver: new SqlDriver({ client: 'pg', connection: process.env.DATABASE_URL, }), });
URL → Driver Inference Table
| URL pattern | Inferred driver | npm package |
|---|---|---|
mongodb://…, mongodb+srv://… | MongoDB | @objectstack/driver-mongodb |
postgres://…, postgresql://… | PostgreSQL (Knex pg) | @objectstack/driver-sql + pg |
mysql://…, mysql2://… | MySQL (Knex mysql2) | @objectstack/driver-sql + mysql2 |
libsql://…, https://*.turso.… | Turso / libSQL | @objectstack/driver-turso |
file:…, sqlite:…, :memory:, *.db / *.sqlite | SQLite (Knex better-sqlite3) | @objectstack/driver-sql + better-sqlite3 |
| (unset, dev mode) | In-memory (default) | @objectstack/driver-memory |
Supported Drivers
| Driver | npm package | Class | Explicit OS_DATABASE_DRIVER value |
|---|---|---|---|
| PostgreSQL | @objectstack/driver-sql (peer: pg) | SqlDriver | postgres | postgresql | pg |
| MySQL | @objectstack/driver-sql (peer: mysql2) | SqlDriver | mysql | mysql2 |
| SQLite | @objectstack/driver-sql (peer: better-sqlite3) | SqlDriver | sqlite | sql |
| Turso / libSQL | @objectstack/driver-turso | TursoDriver | turso | libsql |
| MongoDB | @objectstack/driver-mongodb | MongoDBDriver | mongodb | mongo |
| Memory | @objectstack/driver-memory | InMemoryDriver | memory (dev default) |
All SQL flavours (PostgreSQL / MySQL / SQLite) are served by a single
@objectstack/driver-sqlpackage — there is no separatedriver-postgres,driver-mysql, ordriver-sqlitepackage. Pick the Knex client name (pg/mysql2/better-sqlite3) when you instantiateSqlDriver.
PostgreSQL (via @objectstack/driver-sql)
pnpm add @objectstack/driver-sql pgSqlDriver's constructor accepts a Knex Knex.Config object verbatim.
import { SqlDriver } from '@objectstack/driver-sql';
new SqlDriver({
client: 'pg',
connection: {
host: 'db.example.com',
port: 5432,
user: 'admin',
password: process.env.DB_PASSWORD,
database: 'myapp',
ssl: true,
},
pool: { min: 2, max: 10 },
});Or via env var alone (driver inferred from postgres:// scheme):
export OS_DATABASE_URL=postgres://admin:secret@db.example.com:5432/myappMongoDB
Configuration properties for the MongoDB driver.
| Property | Type | Required | Description |
|---|---|---|---|
| url | string | optional | Connection URI (e.g., mongodb://host:27017/db) |
| database | string | ✅ | Database Name |
| host | string | optional | Host address (default: localhost) |
| port | number | optional | Port number (default: 27017) |
| username | string | optional | Auth User |
| password | string | optional | Auth Password |
| authSource | string | optional | Authentication Database (default: admin) |
| ssl | boolean | optional | Enable SSL |
| replicaSet | string | optional | Replica Set Name |
| readPreference | Enum | optional | Read Preference (primary, secondary, nearest) |
| maxPoolSize | number | optional | Max Connection Pool Size (default: 10) |
| minPoolSize | number | optional | Min Connection Pool Size (default: 0) |
Example (config):
import { MongoDBDriver } from '@objectstack/driver-mongodb';
datasources: {
default: {
driver: 'mongodb',
url: 'mongodb+srv://admin:secret@cluster.mongodb.net/myapp',
readPreference: 'nearest',
maxPoolSize: 50,
},
}Example (env-var, recommended for objectstack dev / objectstack serve):
export OS_DATABASE_URL=mongodb://localhost:27017/myapp
pnpm devThe CLI infers the MongoDB driver from the mongodb:// (or mongodb+srv://)
URL scheme automatically — no OS_DATABASE_DRIVER needed. Set
OS_DATABASE_DRIVER=mongodb only if you want to be explicit.
SQLite (via @objectstack/driver-sql)
SQLite is ideal for local-first development and embedded applications.
It uses the same SqlDriver class with client: 'better-sqlite3'.
pnpm add @objectstack/driver-sql better-sqlite3import { SqlDriver } from '@objectstack/driver-sql';
new SqlDriver({
client: 'better-sqlite3',
connection: { filename: './data/app.db' },
useNullAsDefault: true,
});Env-var path (driver inferred from file: / :memory: / .db paths):
export OS_DATABASE_URL=file:./data/app.db
# or
export OS_DATABASE_URL=:memory:Memory Driver
The in-memory driver stores data in a JavaScript Map. Data is lost when the process exits.
This is the default driver auto-registered by objectstack dev when no
OS_DATABASE_DRIVER is set and no driver is provided programmatically.
import { InMemoryDriver } from '@objectstack/driver-memory';
new InMemoryDriver();Use the memory driver for unit tests. It requires no setup and runs instantly.
apps/objectos and Single-Project Local Mode
When running apps/objectos (or any boot stack with runtime: { cloudUrl: 'local' }),
two databases are involved:
| DB | Purpose | Env var |
|---|---|---|
| Project DB | Your business data (the records served at /api/v1/data/*) | OS_DATABASE_URL / OS_DATABASE_DRIVER |
| Control DB | Framework bookkeeping (sys_organization, sys_project, …) | OS_CONTROL_DATABASE_URL |
Both honor the same URL-scheme inference described above. If
OS_CONTROL_DATABASE_URL is unset, the control DB defaults to a local
SQLite file (<dataDir>/control.db); for backward compatibility
OS_DATABASE_URL is also accepted as a fallback for the control DB
when no explicit OS_CONTROL_DATABASE_URL is provided and no project DB
URL has consumed it.
# Run apps/objectos with MongoDB as the project DB (control DB stays sqlite):
OS_DATABASE_URL=mongodb://localhost:27017/objectos pnpm dev
# Pin both DBs explicitly:
OS_DATABASE_URL=mongodb://localhost:27017/objectos \
OS_CONTROL_DATABASE_URL=postgres://user:pass@host/control \
pnpm devMulti-Datasource
ObjectStack supports multiple data sources. Objects can target specific datasources:
import { SqlDriver } from '@objectstack/driver-sql';
import { MongoDBDriver } from '@objectstack/driver-mongodb';
export default defineStack({
datasources: {
primary: new SqlDriver({ client: 'pg', connection: process.env.PG_URL }),
analytics: new SqlDriver({ client: 'pg', connection: process.env.ANALYTICS_URL }),
cache: new MongoDBDriver({ url: process.env.MONGO_URL! }),
},
});Then in your object definition:
export const AuditLog = ObjectSchema.create({
name: 'audit_log',
datasource: 'analytics', // Routes to the analytics database
fields: { /* ... */ },
});