Migrations

Manage database schema changes with automatic migration generation

Generate Migrations

Use the CLI to generate migrations from your model definitions:

terminal
❯bunx stabilize-cli generate:migration User

Or generate migrations programmatically:

scripts/generate-migration.ts
import { generateMigration, DBType } from "stabilize-orm";
import { User } from "./models/User";
const migration = await generateMigration(User, "create_users", DBType.Postgres);
console.log("Up:", migration.up);
console.log("Down:", migration.down);
// Up: CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, ...)
// Down: DROP TABLE IF EXISTS users

Run Migrations

terminal
❯bunx stabilize-cli migrate
terminal
❯bunx stabilize-cli migrate:rollback
terminal
❯bunx stabilize-cli migrate:fresh --force

migrate:fresh drops all tables and re-runs migrations without seeding.

Migration Tracking

Stabilize tracks applied migrations in the stabilize_migrations table. Check status with:

terminal
❯bunx stabilize-cli status

What Gets Generated

The migration generator reads your model config and produces SQL for:

  • Table creation with correct column types per database
  • Auto-increment primary key for id columns
  • NOT NULL constraints for required columns
  • UNIQUE constraints for unique columns
  • DEFAULT values and expressions
  • Timestamp columns from timestamps config
  • History table if versioned: true

Best Practices

  • Always review generated migrations before running
  • Test migrations on a copy of production data
  • Never modify existing migrations after they've been deployed
  • Use migrate:fresh only in development
  • Back up your database before running migrations in production

AutoMigrate (GORM-style)

For rapid development, use autoMigrate instead of manual migrations. It automatically creates tables and adds missing columns:

app.ts
// Single model
await orm.autoMigrate(User);
// Multiple models
await orm.autoMigrate([User, Post, Comment]);
terminal
❯bunx stabilize-cli migrate:auto

AutoMigrate is safe — it never deletes data. See the AutoMigrate docs for details.