Skip to content

SQLite Node

Self-contained provider for SQLite in Node.js. ESM-only.

ESM-only. Only supports import. Not compatible with require().


  • Driver: better-sqlite3
  • Compiler: SQL generation via @jsorm/compiler (sqliteDialect)
  • Connection manager: WAL mode + foreign keys enabled
  • Execute: CRUD and aggregation
  • Schema sync: creates missing tables

import { createSqliteNodeProvider } from "@jsorm/provider-sqlite-node";
const result = createSqliteNodeProvider(models, { database: "./data.db" | ":memory:" });
Param Type Description
database string Path to .db file or :memory: (default: :memory:)
syncSchema boolean Create missing tables on instantiation (default: false)
cursorSecret string Secret for signing cursors (required for .cursor())
jsorm.config.ts
import { defineConfig, env } from "@jsorm/core";
export default defineConfig({
databases: {
main: {
provider: "sqlite-node",
options: { database: env("DATABASE_URL_SQLITE") },
},
},
});
.env
DATABASE_URL_SQLITE=./data/prod.db

If the value is not an env var name (e.g., ./data.db or :memory:), it is used directly without resolution. Detection is by pattern: ^[A-Z_][A-Z0-9_]*$.

type SqliteNodeProviderResult = {
provider: Provider;
raw: (sql: string, params?: unknown[]) => unknown;
all: (sql: string, params?: unknown[]) => unknown[];
close: () => void;
syncSchema: () => SchemaReport;
getMissingTables: () => string[];
};
import { createJsorm } from "@jsorm/client";
import { createSqliteNodeProvider } from "@jsorm/provider-sqlite-node";
const jsorm = createJsorm<DB>(config, models, {
main: (ctx) => createSqliteNodeProvider(ctx.models, ctx.options),
});

syncSchema() compares model metadata against existing SQLite tables and creates missing ones.

const result = createSqliteNodeProvider(models, { syncSchema: true });
// Console output: [jsorm] Created tables: users, posts, roles

It can also be called after instantiation:

const result = createSqliteNodeProvider(models);
const report = result.syncSchema();
console.log(report.created); // ["users", "posts"]
console.log(report.existing); // []

  • Enables journal_mode = WAL for better concurrency
  • Enables foreign_keys = ON
  • All columns use native SQLite typing (TEXT, INTEGER, REAL)