beego orm需单独安装github.com/beego/beego/v2/client/orm及对应数据库驱动(如mysql),必须匿名导入驱动包,registerdatabase须在registermodel前调用,“default”别名不可省略,dsn建议含parsetime=true和utf8mb4。

Beego 的 ORM 模块不是随主框架自动安装的,必须单独引入;当前(2026 年)主流用法是 github.com/beego/beego/v2/client/orm,旧路径 github.com/astaxie/beego/orm 已不推荐,尤其在 v2+ 项目中会触发导入冲突或初始化失败。
安装 beego/v2 下的 orm 包和对应数据库驱动
你得装两个东西:ORM 核心 + 数据库驱动(比如 MySQL)。缺一不可,否则 RegisterDataBase 会 panic 或报 driver: unknown driver "mysql"。
go get github.com/beego/beego/v2/client/orm-
go get github.com/go-sql-driver/mysql(MySQL 场景) - PostgreSQL 用
github.com/lib/pq,SQLite 用github.com/mattn/go-sqlite3
注意:_ "github.com/go-sql-driver/mysql" 必须在任意 init() 函数所在文件中以匿名导入方式写明,不能只装不引——Go 编译器不会自动注册驱动。
初始化时 RegisterDataBase 的参数顺序和含义
orm.RegisterDataBase("default", "mysql", "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8", 30) 这行里,第四个参数是可选的空闲连接数(对应 SetMaxIdleConns),不是超时时间也不是重试次数。
- 第一个参数是数据库别名,
"default"是硬性要求:所有未显式指定 db 别名的操作(如orm.NewOrm())都走它 - 第二个参数是 driverName,必须和驱动包注册的 name 一致(MySQL 驱动注册的是
"mysql",不是"mariadb"或"mysql2") - 第三个参数是 DSN,
?charset=utf8建议升级为?charset=utf8mb4&parseTime=True&loc=Local,否则中文存入可能乱码、time.Time 字段解析失败
model 注册和 RunSyncdb 容易忽略的细节
orm.RegisterModel(new(User)) 必须在 RegisterDataBase 之后调用,否则 RunSyncdb 会跳过该 model;且 struct 字段若含指针或嵌套结构,需显式加 tag,例如 UserId int `orm:"column(user_id)"`,否则默认按字段名映射列,大小写敏感又容易错位。
-
RunSyncdb("default", false, true)中第二个参数为false表示“不删表重建”,第三个参数true表示“字段变更时 ALTER TABLE”,但不会自动删掉多余字段——它只加、不减、不改类型 - 如果表已存在且字段类型不兼容(比如原
VARCHAR(50),model 改成string \`orm:"size(10)"\`),同步会失败并报错,不会静默降级 - struct 的主键字段必须叫
Id或显式标注orm:"pk",否则Insert返回 0 且无错误提示
最常卡住的地方其实是驱动没匿名导入,或者 DSN 里漏了 parseTime=True 导致 time.Time 扫描失败——错误信息往往只显示 Scan error on column index 2,根本看不出是时区或类型问题。











