Overview
Safe database migration practices. Covers migration tools (Prisma, Knex, Flyway), forward-only migrations, rollback strategies, data backfill, and zero-downtime deployments.
Capabilities
- Write safe schema migrations (add column, rename, drop)
- Design rollback strategies for destructive changes
- Plan zero-downtime migrations for production
- Backfill data without locking tables
- Test migrations against production data snapshots
When to Use
Trigger phrases:
"database migration"
"Safe database migrations — schema changes, data migrations, rollback strategies,"
Adding or modifying database schema
Need zero-downtime deployment with schema changes
Data migration between tables or formats
Production migration needs rollback plan
When NOT to Use
- Task is about deployment, not development (use deploy skills)
- Task is about code review, not writing (use review skills)
- You need to understand existing code first (use research skills)
- Task is about testing only (use test skills)
- Requirements are unclear (clarify first)
- Task is trivially simple (single line fix)
Pseudo Code
The database-migration workflow follows a standard pipeline pattern.
Core flow:
# database-migration primary flow
input = prepare(raw_data)
result = process(input, config={changes, data, database, deploys, downtime})
validate(result)
deliver(result)
Error handling:
on error:
log(error_details)
retry_with_backoff(max=3)
if still_failing: alert_and_escalate()
Safe Column Addition
-- Step 1: Add column (nullable, no lock)
ALTER TABLE users ADD COLUMN phone VARCHAR(20) NULL;
-- Step 2: Backfill (in batches)
UPDATE users SET phone = legacy_phone WHERE phone IS NULL LIMIT 1000;
-- Step 3: Add NOT NULL constraint (after backfill complete)
ALTER TABLE users ALTER COLUMN phone SET NOT NULL;
Prisma Migration
# Create migration
npx prisma migrate dev --name add_phone_column
# Deploy to production
npx prisma migrate deploy
Common Patterns
- Nullable first: Add columns as NULL, backfill, then add NOT NULL
- Batch backfill: Update in batches of 1000 to avoid locking
- Shadow tables: Create new table, migrate data, swap names
- Test with prod snapshot: Always test migrations against prod data copy
How to Use
- Understand the requirement and existing codebase patterns
- Design the solution with error handling and testability in mind
- Implement incrementally with tests for each change
- Verify against expected outcomes (manual and automated)
- Document usage, edge cases, and integration points
- Review with team before merging to shared branches
Red Flags
- Skipping tests to ship faster: Untested code breaks in production when you least expect it
- No error handling in production code: Unhandled errors crash services and lose user data
- Hardcoded configuration values: Hardcoded values prevent environment switching and leak secrets
- Ignoring security implications: Missing input validation, auth bypasses, and injection vulnerabilities
- Over-engineering simple solutions: Premature abstraction adds complexity without proportional benefit
Verification
Process
- Analyze the task requirements
- Apply domain expertise
- Verify output quality
Anti-Rationalization Table
| Rationalization |
Reality |
| "Tests slow me down" |
Bugs slow you down 10x more. Tests are speed, not overhead. |
| "I will refactor later" |
Technical debt compounds. Refactor as you go. |
| "It works on my machine" |
If it is not in CI, it does not work. Ship proof, not claims. |
1---2name: database-migration3description: Use when safe database migrations — schema changes, data migrations, rollback strategies, and zero-downtime deploys. Use when working with database migration.4license: Apache-2.05---6789## Overview1011Safe database migration practices. Covers migration tools (Prisma, Knex, Flyway), forward-only migrations, rollback strategies, data backfill, and zero-downtime deployments.1213## Capabilities1415- Write safe schema migrations (add column, rename, drop)16- Design rollback strategies for destructive changes17- Plan zero-downtime migrations for production18- Backfill data without locking tables19- Test migrations against production data snapshots2021## When to Use22**Trigger phrases:**23- "database migration"24- "Safe database migrations — schema changes, data migrations, rollback strategies,"252627- Adding or modifying database schema28- Need zero-downtime deployment with schema changes29- Data migration between tables or formats30- Production migration needs rollback plan3132## When NOT to Use3334- Task is about deployment, not development (use deploy skills)35- Task is about code review, not writing (use review skills)36- You need to understand existing code first (use research skills)37- Task is about testing only (use test skills)38- Requirements are unclear (clarify first)39- Task is trivially simple (single line fix)404142## Pseudo Code4344The database-migration workflow follows a standard pipeline pattern.4546Core flow:47```48# database-migration primary flow49input = prepare(raw_data)50result = process(input, config={changes, data, database, deploys, downtime})51validate(result)52deliver(result)53```5455Error handling:56```57on error:58 log(error_details)59 retry_with_backoff(max=3)60 if still_failing: alert_and_escalate()61```626364### Safe Column Addition65```sql66-- Step 1: Add column (nullable, no lock)67ALTER TABLE users ADD COLUMN phone VARCHAR(20) NULL;6869-- Step 2: Backfill (in batches)70UPDATE users SET phone = legacy_phone WHERE phone IS NULL LIMIT 1000;7172-- Step 3: Add NOT NULL constraint (after backfill complete)73ALTER TABLE users ALTER COLUMN phone SET NOT NULL;74```7576### Prisma Migration77```bash78# Create migration79npx prisma migrate dev --name add_phone_column8081# Deploy to production82npx prisma migrate deploy83```8485## Common Patterns8687- **Nullable first**: Add columns as NULL, backfill, then add NOT NULL88- **Batch backfill**: Update in batches of 1000 to avoid locking89- **Shadow tables**: Create new table, migrate data, swap names90- **Test with prod snapshot**: Always test migrations against prod data copy9192## How to Use93941. Understand the requirement and existing codebase patterns952. Design the solution with error handling and testability in mind963. Implement incrementally with tests for each change974. Verify against expected outcomes (manual and automated)985. Document usage, edge cases, and integration points996. Review with team before merging to shared branches100101## Red Flags102103- **Skipping tests to ship faster**: Untested code breaks in production when you least expect it104- **No error handling in production code**: Unhandled errors crash services and lose user data105- **Hardcoded configuration values**: Hardcoded values prevent environment switching and leak secrets106- **Ignoring security implications**: Missing input validation, auth bypasses, and injection vulnerabilities107- **Over-engineering simple solutions**: Premature abstraction adds complexity without proportional benefit108109## Verification110111- [ ] Skill output matches expected behavior112113## Process1141151. Analyze the task requirements1162. Apply domain expertise1173. Verify output quality118119## Anti-Rationalization Table120121| Rationalization | Reality |122|---|---|123| "Tests slow me down" | Bugs slow you down 10x more. Tests are speed, not overhead. |124| "I will refactor later" | Technical debt compounds. Refactor as you go. |125| "It works on my machine" | If it is not in CI, it does not work. Ship proof, not claims. |