MuseMVP Docs
Database

Database Migrations

Managing database schema changes and migrations using Drizzle ORM.

MuseMVP uses Drizzle Kit for schema migrations. Migrations are SQL files generated from schema changes and applied in order to keep your database in sync with the codebase.

Migration Workflow

Edit src/backend/database/schema.ts — add tables, columns, or indexes.

Run pnpm drizzle:generate — Drizzle generates a new migration file in src/backend/database/migrations/.

Review the generated SQL — ensure it matches your intent.

Run pnpm drizzle:migrate — apply migrations to your database.


Migration Files

0000_futuristic_hellfire_club.sql
0001_dry_terror.sql
meta/_journal.json

The template currently ships a baseline migration plus later numbered diffs. Fresh databases should apply 0000_*.sql from zero, then 0001_*.sql (adds app_setting and app_setting_revision for Runtime Settings). After you change schema.ts in a running project, generate additional numbered files as usual.

  • SQL files: Each migration is a numbered SQL file (e.g. 0000_*.sql, then 0001_*.sql for later diffs).
  • Journal: meta/_journal.json tracks migration order and metadata.

Do Not Edit Applied Migrations

Once a migration has been applied to production, do not modify it. Create a new migration for further changes.


Commands Reference

CommandPurpose
pnpm drizzle:generateGenerate migration from schema diff
pnpm drizzle:migrateApply pending migrations
pnpm drizzle:pushPush schema directly (skips migrations; dev only)
pnpm drizzle:studioOpen Drizzle Studio for visual DB inspection

When to Use drizzle:push vs drizzle:migrate

ApproachUse Case
drizzle:migrateProduction, team projects, version-controlled schema changes
drizzle:pushLocal prototyping, quick schema iteration; no migration history

For production deployments, always use drizzle:migrate and commit migration files.


Configuration

Migrations use the same connection as the app. Ensure DATABASE_URL (or Hyperdrive for Cloudflare) is set before running:

# .env
DATABASE_URL="postgresql://user:pass@host:5432/dbname"

The Drizzle config in drizzle.config.ts reads from DATABASE_URL and outputs migrations to ./src/backend/database/migrations.

On this page