XORM可通过Sync2根据Go结构体自动创建或更新数据库表。需定义带xorm标签的结构体(首字母小写映射为表名),配置引擎并确保数据库存在;Sync2支持单表、多表同步及自定义表名建表,但不修改已存在字段的类型。

在开发初期快速验证模型与数据库结构一致性时,需要让XORM根据Go结构体自动创建对应数据表,避免手动写SQL建表语句。
准备结构体并配置XORM引擎
定义一个带xorm标签的结构体,例如User,字段名、类型和tag必须明确;【结构体首字母小写才会被默认映射为表名(如User→user)】。使用xorm.NewEngine连接数据库,确保DSN正确且数据库已存在,否则Sync2会报错无法建库。
调用engine.ShowSQL(true)开启SQL日志,方便确认实际执行了哪些DDL语句。
执行Sync2完成建表
直接调用engine.Sync2(new(User))即可触发同步逻辑。
这一步操作起来很简单,但要注意:如果数据库中尚无user表,Sync2会完整创建表(含主键、索引、默认值、非空约束);如果表已存在但字段缺失(比如新增了Email字段),Sync2会自动执行ALTER TABLE ADD COLUMN;【字段名一致但类型不匹配(如struct里是int64,DB里是TINYINT)时,Sync2仅警告,不会修改类型】。
批量同步多个结构体
方法一:传入多个指针参数
engine.Sync2(new(User), new(Order), new(Product))
方法二:用切片包裹后展开调用
models := []interface{}{new(User), new(Order), new(Product)}
engine.Sync2(models...)
两种方式效果完全相同,推荐方法一,代码更直观易读。注意所有结构体必须已定义且能被正常实例化,nil或未初始化的指针会导致panic。
动态指定表名建表
第一步:为结构体实现TableName()方法,返回自定义表名字符串
func (User) TableName() string { return "t_user_v2" }
第二步:调用engine.Table("t_user_v2").Sync2(new(User))
这会跳过默认表名推导,强制以指定名称操作。适用于灰度表、分表场景,比如上线前先建t_user_new,验证无误后再切换读写。
第三步:若需完全绕过结构体绑定,直接按结构体模板新建任意命名表,可改用engine.Table("log_202611").CreateTable(&LogEntry{})——但此法不支持后续字段更新,仅适合一次性建表。











