sync2 是 xorm 的表结构同步工具,仅按字段名对比并执行创建表、新增字段、警告不一致项等操作,但不删除字段、不重命名、不校验类型与约束,也不处理数据迁移,故不可用于生产环境自动执行。

Sync2 是 Xorm 实际可用的自动迁移入口,但直接调用它不等于“开箱即用”。它只做结构对齐,不处理数据迁移、字段重命名、类型收缩等业务逻辑变更,误用反而导致线上表结构被意外修改或丢字段。
Sync2 会做什么、不会做什么
它按字段名逐一对比 struct tag 和数据库 schema,然后执行:
- 表不存在 → 创建表(含索引、主键、默认值)
- 字段在 struct 中有、DB 中无 →
ALTER TABLE ADD COLUMN - 字段在 DB 中有、struct 中无 → 打印警告(需显式设置
engine.ShowWarn = true) - 字段类型不一致(如 struct 是
int64,DB 是TINYINT)→ 打印警告,不会自动改类型 - 字段非空约束/默认值不匹配 → 打印警告,不会自动同步 NOT NULL 或 DEFAULT
- 不会删除字段,也不会重命名字段(哪怕你改了 struct 字段名 + tag,旧字段仍残留)
为什么 Sync2 不该用在生产环境自动执行
它本质是开发期辅助工具,不是迁移框架。常见踩坑点:
- 某次上线把
Age int `xorm:"int"`改成Age int `xorm:"tinyint"`,Sync2不报错也不改,结果插入超范围值时 MySQL 报错截断 - 删掉 struct 字段后,对应 DB 字段还在,后续插入/查询可能因字段残留引发逻辑错误
- 新增带
not null的字段,但没设default,Sync2会失败(MySQL 拒绝添加 not null 无默认值字段) - PostgreSQL 对
text和varchar处理更严格,Sync2不会帮你转换已有数据
真正可控的迁移做法
保留 Sync2 用于本地开发环境快速建表,生产环境走显式 SQL 迁移:
- 用
xorm.io/xorm的engine.Exec()执行 DDL,例如:engine.Exec("ALTER TABLE user ADD COLUMN avatar_url TEXT") - 字段重命名必须拆成两步:
ADD COLUMN+UPDATE ... SET new_col = old_col+DROP COLUMN - 对大表加索引,务必加
ALGORITHM=INPLACE, LOCK=NONE(MySQL 5.6+),否则锁表 - 所有 DDL 都要写回滚语句,并在测试库验证耗时和影响行数
- 避免在 struct tag 里写
autoincr后又手动插入 ID —— Xorm 会忽略你给的值,还可能触发主键冲突
自动迁移最危险的地方,不是它做不到什么,而是它“看起来做了,其实没做全”。字段删不掉、类型不校验、约束不同步——这些静默差异,往往在线上跑几天后才暴露。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











