Use when adding/modifying database columns, encountering "FOREIGN KEY constraint failed", "no such column", "cannot add NOT NULL column" errors, or creating schema migrations for SQLite/GRDB/SQLiteData - prevents data loss with safe migration patterns and testing workflows for iOS/macOS apps
View on GitHubSelect agents to install to:
npx add-skill https://github.com/CharlesWiltgen/Axiom/blob/main/.claude-plugin/plugins/axiom/skills/axiom-database-migration/SKILL.md -a claude-code --skill axiom-database-migrationInstallation paths:
.claude/skills/axiom-database-migration/# Database Migration ## Overview Safe database schema evolution for production apps with user data. **Core principle** Migrations are immutable after shipping. Make them additive, idempotent, and thoroughly tested. ## Example Prompts These are real questions developers ask that this skill is designed to answer: #### 1. "I need to add a new column to store user preferences, but the app is already live with user data. How do I do this safely?" → The skill covers safe additive patterns for adding columns without losing existing data, including idempotency checks #### 2. "I'm getting 'cannot add NOT NULL column' errors when I try to migrate. What does this mean and how do I fix it?" → The skill explains why NOT NULL columns fail with existing rows, and shows the safe pattern (nullable first, backfill later) #### 3. "I need to change a column from text to integer. Can I just ALTER the column type?" → The skill demonstrates the safe pattern: add new column → migrate data → deprecate old (NEVER delete) #### 4. "I'm adding a foreign key relationship between tables. How do I add the relationship without breaking existing data?" → The skill covers safe foreign key patterns: add column → populate data → add index (SQLite limitations explained) #### 5. "Users are reporting crashes after the last update. I changed a migration but the app is already in production. What do I do?" → The skill explains migrations are immutable after shipping; shows how to create a new migration to fix the issue rather than modifying the old one --- ## ⛔ NEVER Do These (Data Loss Risk) #### These actions DESTROY user data in production ❌ **NEVER use DROP TABLE** with user data ❌ **NEVER modify shipped migrations** (create new one instead) ❌ **NEVER recreate tables** to change schema (loses data) ❌ **NEVER add NOT NULL column** without DEFAULT value ❌ **NEVER delete columns** (SQLite doesn't support DROP COLUMN safely) #### If you're tempted to do any of these, STOP and use the safe patt