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 PostgreSQLConfigure
You can let Drizzleasy auto-detect your setup or configure it manually.
Option A — Auto-detect (recommended)
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