beego orm中registermodel必须在registerdatabase之后调用,否则报“no registered model”;rel(one)需显式声明外键列,reverse(one)仅用于反向查询;runsyncdb第三个参数true会删表重建,生产禁用。

beego 的 orm.RegisterModel 必须在数据库注册之后调用
很多初学者把 orm.RegisterModel 放在 orm.RegisterDataBase 前面,结果运行时插入数据报错:no registered model 或 unknown table。这是因为 beego ORM 在执行建表或查询前,会先检查模型是否已注册、数据库连接是否就绪。
正确顺序是:
- 先调用
orm.RegisterDataBase("default", "mysql", "user:pass@tcp(127.0.0.1:3306)/dbname") - 再调用
orm.RegisterModel(new(Author), new(Article)) - 最后(可选)调用
orm.RunSyncdb("default", false, true)自动建表
字段 tag 中的 rel(one) 和 reverse(one) 不能混用或漏写外键列
rel(one) 表示“本模型持有对方外键”,ORM 会在当前表建外键字段;reverse(one) 表示“反向查一对一”,不建字段,只用于查询链式调用。两者语义完全不同,写错会导致建表失败或关联查询返回 nil。
常见错误写法:
type AuthorInfo struct {
Id int32 `orm:"column(id);pk;auto"`
Author *Author `orm:"reverse(one)"` // ❌ 错!这里没定义外键列,也不会建 foreign key
}
正确写法(带外键列声明):
type AuthorInfo struct {
Id int32 `orm:"column(id);pk;auto"`
Author *Author `orm:"column(author_id);rel(one)"`
}
注意:column(author_id) 必须显式写出,否则 ORM 不知道外键字段名。
bee generate model 生成的结构体默认不带表名和字段映射,需手动补全
用 bee generate model Article -fields="title:string,content:text" 生成的 Article 结构体,默认只有基础字段和 orm:"auto",没有指定表名、字段列名、索引或关系。直接运行 RunSyncdb 会建出 snake_case 表名(如 article),但字段名可能与预期不符(比如 Title 映射成 title 是对的,但若想映射为 article_title 就必须加 column tag)。
建议生成后立即补全:
- 加
TableName()方法指定表名 - 每个字段加
orm:"column(xxx)"明确列名 - 关系字段补上
rel(one)/rel(many)或reversetag - 主键必须有
pk,自增必须有auto
RunSyncdb("default", false, true) 的三个参数含义容易误解
第三个参数 true 表示“删除已有表并重建”,生产环境绝对不能设为 true。第二个参数 false 表示“不打印 SQL 日志”,调试时建议设为 true 看 ORM 实际执行了什么。
安全做法是:
- 开发阶段:用
RunSyncdb("default", true, false)查看建表语句,确认无误后再手动执行或切回true - 测试/预发环境:禁用自动建表,改用迁移脚本或人工 review SQL
- 字段变更(如加字段)不会被
RunSyncdb自动检测——它只管“有没有这张表”,不管“字段是否一致”
真正需要字段级同步时,得靠 bee generate migrate 或手写 SQL,ORM 的 RunSyncdb 只适合全新建模阶段。











