Go语言GORM怎么建表_Go语言GORM自动迁移教程【最新】
AutoMigrate 按需建表或修改结构首次运行创建表后续对比差异执行 ADD COLUMN/CREATE INDEX 等操作不删字段或改不兼容类型依赖 gorm 标签精准控制字段定义需显式传入所有模型生产环境应避免直接使用且不处理数据迁移。AutoMigrate 会建表但只在需要时建它不是“每次运行都重建”而是先检查表是否存在、字段是否匹配再决定是 CREATE TABLE 还是 ALTER TABLE。所以你改完结构体后多跑几次 AutoMigrate不会报错也不会丢数据——前提是没删字段或改非兼容类型。首次运行表不存在 → 自动建表含主键、索引、外键后续运行对比结构体与现有表 → 缺字段就 ADD COLUMN缺索引就 CREATE INDEX字段类型可扩如 varchar(50) → varchar(100)就改但不会缩容或删列SQLite 等不支持 ALTER COLUMN 的数据库GORM 会走“重建表 拷贝数据 删旧表”流程此时必须保证有写权限且磁盘空间充足字段标签写错表就建不对很多“建了表但字段没生效”“唯一约束没加上”的问题其实出在结构体标签上。GORM 不靠注释或命名约定全靠 gorm: 标签驱动建表逻辑。ID uint gorm:primaryKey —— 没这行GORM 默认用 id 字段当主键但如果你字段名是 ID 却没标 primaryKey它可能当成普通字段导致建表失败或无主键Email string gorm:uniqueIndex —— 写成 unique 只加约束不建索引写成 index 不带唯一性只有 uniqueIndex 才既建唯一约束又建索引Name string gorm:size:100 —— MySQL 下生成 varchar(100)不写默认是 varchar(255)但 SQLite 忽略 size一律当 text 处理多个模型一起迁移顺序无关但得显式传入AutoMigrate 不会自动扫描所有结构体你传谁它就管谁。漏传一个对应表就不会被创建或更新。正确db.AutoMigrate(User{}, Order{}, Product{}) —— 一次搞定三张表错误db.AutoMigrate(User{}) 后忘了加 Order{}那 order 表永远不出现注意外键依赖关系不影响执行顺序GORM 会自动解析但如果你在 User 里写了 Orders []Order gorm:foreignKey:UserID而 Order 模型没传进 AutoMigrate外键列 user_id 仍会建只是不会加外键约束除非你关了 DisableForeignKeyConstraintWhenMigrating生产环境别直接用 AutoMigrate它适合开发和测试阶段快速对齐结构但在生产库上直接跑风险在于没有回滚、无法预览 SQL、不支持字段重命名或类型收缩。一旦出错只能手动救。 VWO 一个A/B测试工具