Database

PostgreSQL with Drizzle ORM. Enabled when DATABASE_URL is set.

DATABASE_URL=postgresql://user:password@host:port/database
DB_PREFIX=your_prefix  # optional, prefixes table names

Commands

bun run db:generate    # generate Drizzle schema from code
bun run db:migrate     # run migrations
bun run db:push        # push schema directly (dev shortcut)
bun run db:studio      # open Drizzle Studio (visual DB browser)
bun run db:reset       # drop + regenerate + migrate + push
bun run db:seed        # seed with test data

Schema

The main schema lives at src/server/db/schema.ts. It defines tables for users, accounts, sessions, posts, payments, teams, projects, API keys, and more.

Payload CMS has its own schema management — it handles migrations for its collections separately. Both share the same database.

Usage

import { db } from "@/server/db";
import { users } from "@/server/db/schema";
import { eq } from "drizzle-orm";

const user = await db.query.users.findFirst({
  where: eq(users.email, "user@example.com"),
});

Hosting

  • Neon — serverless Postgres, good free tier
  • Supabase — Postgres + extras
  • Railway — simple managed Postgres

Key Files

FilePurpose
src/server/db/index.tsDatabase connection
src/server/db/schema.tsDrizzle schema definitions
drizzle.config.tsDrizzle Kit config
src/config/features-config.tsDATABASE_ENABLED flag