Skip to content

Database

The db module wraps Drizzle ORM with a consistent factory API, adding migration management, seeders, model factories, and pagination helpers.

Import

ts
import { createDb } from '@loewen-digital/fullstack/db'

Basic usage

ts
import { createDb } from '@loewen-digital/fullstack/db'

const db = createDb({
  driver: 'sqlite',
  url: './app.db',
})

// db.query is the Drizzle query builder
const users = await db.query.users.findMany({
  where: (users, { eq }) => eq(users.active, true),
})

Defining a schema

Define your schema with Drizzle and pass it to createDb:

ts
import { createDb } from '@loewen-digital/fullstack/db'
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'

const users = sqliteTable('users', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  email: text('email').notNull().unique(),
  name: text('name').notNull(),
  createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
})

const db = createDb({
  driver: 'sqlite',
  url: './app.db',
  schema: { users },
})

Migrations

bash
# Generate a migration from your schema
npx fullstack migrate:generate

# Run pending migrations
npx fullstack migrate:run

# Roll back the last migration
npx fullstack migrate:rollback

Pagination

ts
const page = await db.paginate(
  db.query.users.findMany({ orderBy: (u, { desc }) => desc(u.createdAt) }),
  { page: 1, perPage: 20 }
)

// page.data        — array of results
// page.total       — total record count
// page.currentPage — current page number
// page.lastPage    — last page number
// page.hasMore     — whether more pages exist

Driver options

DriverDescription
sqliteSQLite via better-sqlite3 (great for development)
postgresPostgreSQL via postgres.js
mysqlMySQL/MariaDB via mysql2

Config options

OptionTypeDefaultDescription
driver'sqlite' | 'postgres' | 'mysql'Database driver
urlstringConnection URL or file path
schemaRecord<string, Table>{}Drizzle schema tables
migrations.dirstring'./migrations'Directory for migration files
pool.maxnumber10Maximum connection pool size