Notr Logo

Getting Started

Install and set up Drizzleasy with Next.js and Drizzle ORM.

Drizzleasy provides ultra-simple, type-safe CRUD operations on top of Drizzle ORM.

Install

bun add @remcostoeten/drizzleasy drizzle-orm

# Add database driver (choose one)
bun add @neondatabase/serverless  # Neon PostgreSQL
bun add @libsql/client            # Turso
bun add better-sqlite3            # SQLite
bun add pg                         # Local PostgreSQL

Configure

You can let Drizzleasy auto-detect your setup or configure it manually.

import { initializeConnection } from '@remcostoeten/drizzleasy/server'

async function bootstrap() {
  const db = await initializeConnection(process.env.DATABASE_URL!)
}
  • PostgreSQL, SQLite and Turso are detected from the URL
  • Your schema is loaded from drizzle.config via glob patterns

Turso (libsql) requires an auth token:

import { initializeConnection } from '@remcostoeten/drizzleasy/server'

async function bootstrapTurso() {
  const db = await initializeConnection(process.env.DATABASE_URL!, {
    authToken: process.env.TURSO_AUTH_TOKEN!
  })
}

Environment switching:

import { initializeConnection } from '@remcostoeten/drizzleasy/server'

async function bootstrapEnv() {
  const db = await initializeConnection({
    development: 'file:./dev.db',
    production: process.env.DATABASE_URL!
  })
}

Manual schema override (for Next.js 15/Turbopack or monorepos):

import { initializeConnection } from '@remcostoeten/drizzleasy/server'
import * as schema from './schema'

async function bootstrapManual() {
  const db = await initializeConnection(process.env.DATABASE_URL!, {
    schema
  })
}

Option B — Manual configure

import { configure } from '@remcostoeten/drizzleasy/server'
import { drizzle } from 'drizzle-orm/neon-http'
import * as schema from './schema'

function setup() {
  const db = drizzle(process.env.DATABASE_URL!)
  configure(db, schema)
}

First CRUD in a Next.js Server Action

'use server'
import { createFn, readFn } from '@remcostoeten/drizzleasy/server'

type TSignup = { id: string; email: string; newsletter: 'yes' | 'no' }

export async function createSignup(formData: FormData) {
  'use server'
  const create = createFn<TSignup>()
  return create('signups')({
    email: String(formData.get('email') || ''),
    newsletter: (String(formData.get('newsletter') || 'no') as 'yes' | 'no')
  })
}

export async function listSignups() {
  'use server'
  const read = readFn<TSignup>()
  return read('signups')()
}

Next steps

  • Quickstart: basic patterns and recipes
  • WHERE clauses: natural filtering
  • API: full reference of methods and types