Skip to main content

Migration System

Sunschool uses Drizzle ORM for database migrations with automatic application on server startup. From ENGINEERING.md:
Migrations run automatically on startup. Manual commands available for debugging. Migration folder: drizzle/migrations/ (0000-0008)

How Migrations Work

Migration failures do not block server startup. This prevents downtime from schema issues.

Migration Files

From the repository:

Migration Numbering

Migrations are numbered sequentially starting from 0000. Each file contains:
  • SQL statements to apply schema changes
  • Rollback instructions (if reversible)
  • Comments explaining the purpose
Example migration structure:

Manual Migration Commands

From package.json:

Run Migrations

Push Schema Changes

db:push applies schema changes without generating migration files. Use for rapid prototyping only.

Seed Database

Creating New Migrations

Step 1: Update Schema

Edit shared/schema.ts:

Step 2: Generate Migration

Step 3: Review Generated SQL

Step 4: Apply Migration

Migration Best Practices

Idempotent Migrations

Migrations should be idempotent - safe to run multiple times.
Good: Check before creating
Bad: Always creates

Additive Changes

Prefer additive changes over destructive ones.
Good: Add column with default
Risky: Drop column

Backward Compatibility

Maintain backward compatibility during rolling deployments.
Strategy: Two-phase migrations Phase 1 (Migration 0010):
Phase 2 (Migration 0011, after code update):

Data Migrations

Separate data changes from schema changes:

Rollback Strategy

Manual Rollback

Drizzle does not support automatic rollbacks. Create manual rollback scripts.
Forward migration (0014_add_achievements.sql):
Rollback script (0014_rollback.sql):
Apply rollback:

Database Backups

Always backup before migrations in production.
Neon provides automatic backups:
  • Point-in-time recovery (7 days on Free, 30+ on Pro)
  • Access via Neon Console
  • Branch from backup for testing

Migration Tracking

Drizzle stores applied migrations in a drizzle_migrations table:
Check migration status:

Common Migration Scenarios

Adding a Column

Adding an Index

Modifying a Column

Renaming

Troubleshooting

Cause: Large table, slow operation (e.g., adding index).Fix:
Cause: Existing data doesn’t meet new constraint.Fix:
Cause: Migration ran but wasn’t recorded in tracking table.Fix:
Cause: Database schema doesn’t match shared/schema.ts.Fix:

Testing Migrations

Local Testing

Staging Environment

Always test migrations in staging before production.

Next Steps

Database Setup

Learn about database configuration

Monitoring

Monitor migration success and failures

Troubleshooting

Debug migration issues