{"id":"db-migrator","name":"db-migrator","summary":"データベース移行アシスタント - スキーマの比較、移行スクリプト生成","body":"# 数据库迁移助手\n\n## 触发条件\n当用户要求数据库迁移、生成 migration、schema 变更、数据库升级时激活此技能。\n\n## 工作流程\n\n### 第 1 步：识别框架\n扫描项目文件，判断使用的 ORM/迁移框架：\n- `alembic.ini` / `alembic/` → Alembic\n- `prisma/schema.prisma` → Prisma\n- `pom.xml` 含 flyway → Flyway\n- `manage.py` + `settings.py` → Django\n- `Gemfile` + `db/migrate/` → Rails\n\n### 第 2 步：分析 Schema 变更\n- 对比 models 定义与现有迁移历史\n- 识别新增/修改/删除的表和字段\n- 检测索引、约束、外键变更\n\n### 第 3 步：生成迁移脚本\n根据框架生成对应的迁移文件，并同时生成回滚脚本。\n\n### 第 4 步：风险评估\n- 大表 DDL 变更（锁表风险）\n- 数据迁移需求\n- 向后兼容性\n\n## 迁移模板\n\n### Alembic (Python)\n```python\n\"\"\"add email column to users\n\nRevision ID: abc123\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\n\ndef upgrade():\n    op.add_column('users', sa.Column('email', sa.String(255), nullable=True))\n    op.create_index('ix_users_email', 'users', ['email'], unique=True)\n\ndef downgrade():\n    op.drop_index('ix_users_email')\n    op.drop_column('users', 'email')\n```\n\n### Flyway (Java)\n```sql\n-- V2__add_email_to_users.sql\nALTER TABLE users ADD COLUMN email VARCHAR(255);\nCREATE UNIQUE INDEX ix_users_email ON users(email);\n\n-- 回滚脚本 (单独文件 U2__rollback_add_email.sql)\n-- 逆向操作\n```\n\n### Prisma (Node.js)\n```prisma\n// schema.prisma 变更\nmodel User {\n  id    Int     @id @default(autoincrement())\n  name  String\n  email String? @unique  // 新增字段\n}\n```\n```bash\n# 默认仅生成迁移，不执行数据库变更\nnpx prisma migrate dev --name add-email-to-users --create-only\n```\n\n检查生成的 SQL、连接目标和备份后，再由用户确认执行：\n\n```bash\n# 开发环境应用迁移\nnpx prisma migrate dev\n\n# 生产环境应用已审核并提交的迁移\nnpx prisma migrate deploy\n```\n\n### Django (Python)\n```python\n# users/migrations/0002_add_email.py\nfrom django.db import migrations, models\n\nclass Migration(migrations.Migration):\n    dependencies = [('users', '0001_initial')]\n\n    operations = [\n        migrations.AddField(\n            model_name='user',\n            name='email',\n            field=models.EmailField(unique=True, null=True),\n        ),\n    ]\n```\n\n`unique=True` 已由 Django 生成唯一约束和对应索引，不要再创建重复索引。\n\n### Rails (Ruby)\n```ruby\n# db/migrate/20260617_add_email_to_users.rb\nclass AddEmailToUsers < ActiveRecord::Migration[7.0]\n  def change\n    add_column :users, :email, :string\n    add_index :users, :email, unique: true\n  end\nend\n```\n```bash\nrails db:migrate         # 执行迁移\nrails db:rollback        # 回滚上一次\nrails db:rollback STEP=3 # 回滚最近 3 次\n```\n\n## 回滚策略\n\n| 场景 | 策略 |\n|------|------|\n| 新增列 | 直接移除该列 |\n| 删除列 | 无法自动回滚，需提前备份数据 |\n| 修改列类型 | 反向修改为原类型，注意数据丢失风险 |\n| 新增表 | 移除该表 |\n| 数据迁移 | 编写反向迁移脚本，保留原始数据快照 |\n| 大表变更 | 使用在线 DDL 工具避免锁表 |\n\n## 注意事项\n- 默认只生成和审查迁移；执行前确认环境、数据库连接、备份和维护窗口\n- 框架支持可逆迁移时提供 downgrade；不支持时明确恢复快照或前向修复方案\n- 大表变更需考虑在线 DDL，避免长时间锁表\n- 数据迁移与 schema 变更分开处理\n- 迁移应由框架记录版本并安全重试，不要假设版本迁移可以任意重复执行\n- 在 staging 环境验证后再应用到生产环境\n- 涉及删除列/表的变更，确保应用代码已先移除相关引用","author":"@laolaoshiren","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/laolaoshiren/claude-code-skills-zh/tree/main/skills/db-migrator","license":"MIT","category":"coding","lang":"en","tokens":1058,"stars":0,"calls30d":1,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":[]}}