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
| File | Purpose |
|---|---|
src/server/db/index.ts | Database connection |
src/server/db/schema.ts | Drizzle schema definitions |
drizzle.config.ts | Drizzle Kit config |
src/config/features-config.ts | DATABASE_ENABLED flag |