用途:Serverpod 的数据库迁移系统会为 .spy.yaml 中带 table 的模型变更生成 SQL。当新增、删除或重命名表模型或字段,修改会改变生成外键的关系字段,或新增、删除、更改索引时需要迁移;项目未配置数据库(如 config/<runMode>.yaml 无 database 段)时不需要。
应用方式:通过 serverpod MCP 调用 apply_migrations 工具(通常在 serverpod start 运行时);或以 dart run bin/main.dart --apply-migrations 启动服务器(通常用于生产)。
标准流程:有 serverpod start 和 MCP 时,用 create_migration 创建、apply_migrations 应用,始终优先使用 MCP。仅当 MCP 连接失败时用 CLI:先 serverpod generate 生成代码,再用 serverpod create-migration 创建迁移。
编辑迁移:迁移目录含 migration.sql、definition.sql 及 definition.json、definition_project.json、migration.json。仅 migration.sql 可在创建后手工编辑,常见于添加数据转换,或把破坏性变更改为非破坏性(如先加新列、回填、再删旧列)。切勿编辑其他文件,否则会破坏后续所有迁移。无迁移的数据库仅由最新 definition.sql 创建,不运行 migration.sql;已有数据库按顺序应用较新的 migration.sql,因此编辑后的 migration.sql 最终 schema 必须与 definition.sql 一致,数据转换只影响经该版本升级的数据库。已应用的迁移再编辑无效,需新建迁移。客户端侧(database: client 或 all)同理,版本内 migration.dart 的 SQL 及其定义 SQL/JSON 文件同样不可改。
修复迁移:数据库状态不一致时,通过读取实时 schema 并与目标迁移版本 diff 生成修复迁移,数据库须可访问。有 MCP 时用 create_repair_migration(可选 version、tag、force,破坏性变更或无漂移时需 force),再用 apply_migrations 应用,无需重启服务器。仅当 MCP 失败时用 CLI:serverpod create-repair-migration [--mode production] [--version <name>] [--force] [--tag <tag>],然后请用户以 dart run bin/main.dart --apply-repair-migration 重启服务器应用。