必须导入MySQL驱动并注册为"default"别名,连接串需含charset=utf8mb4、parseTime=True和loc=Local,模型注册须在数据库注册之后,字段名首字母大写,配置项用双冒号分隔。

必须先导入 MySQL 驱动,否则 runtime panic
Beego ORM 本身不带任何数据库驱动,_ "github.com/go-sql-driver/mysql" 这行导入不能少,且必须是下划线导入(只执行 init 函数)。漏掉这行,orm.RegisterDataBase 不会报错,但第一次调用 orm.NewOrm() 或 QueryTable 时直接 panic,错误信息是 sql: unknown driver "mysql" —— 容易误以为是连接串写错了。
其他驱动同理:_ "github.com/lib/pq"(PostgreSQL)、_ "github.com/mattn/go-sqlite3"(SQLite3)。
RegisterDataBase 的 alias 必须是 "default"(单库场景)
哪怕你只连一个库,也必须注册为 "default" 别名。Beego ORM 所有默认操作(如 orm.NewOrm()、orm.QueryTable("User"))都隐式绑定这个别名。如果注册成 "mydb" 却没显式调用 orm.NewOrmWithDB("mydb"),所有 ORM 操作都会失败。
常见错误现象:
panic: no database alias named 'default'- 日志里显示连接成功,但
Insert返回0、Read返回no rows in result set
正确写法示例:
orm.RegisterDataBase("default", "mysql", "root:pass@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local")
MySQL 连接字符串的 charset 和时区参数不能省
不加 ?charset=utf8mb4,中文插入会变成问号或触发 Incorrect string value 错误;MySQL 8.0+ 默认 collation 是 utf8mb4_0900_ai_ci,更需要显式声明。
&parseTime=True&loc=Local 也很关键:没有它,time.Time 字段读出来是空值或解析失败;loc=Local 避免服务器 UTC 时间和业务本地时间错位。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
端口不能省略:@tcp(localhost)/db 会失败,必须写成 @tcp(127.0.0.1:3306)/db。
连接串拼接建议用变量组装,避免硬编码:
host := beego.AppConfig.String("db::host")
port := beego.AppConfig.String("db::port")
user := beego.AppConfig.String("db::user")
pwd := beego.AppConfig.String("db::password")
dbname := beego.AppConfig.String("db::dbname")
dsn := user + ":" + pwd + "@tcp(" + host + ":" + port + ")/" + dbname + "?charset=utf8mb4&parseTime=True&loc=Local"
模型注册和自动建表要放在 RegisterDataBase 之后
顺序错了会 panic。正确初始化顺序是:
- 导入驱动(
_ "github.com/go-sql-driver/mysql") - 注册驱动(
orm.RegisterDriver("mysql", orm.DRMySQL),可选,因为 MySQL 已内置) - 注册数据库(
orm.RegisterDataBase("default", ...)) - 注册模型(
orm.RegisterModel(new(User), new(Post))) - (可选)自动建表(
orm.RunSyncdb("default", false, true))
注意:RunSyncdb 第二个参数是 force(是否删表重建),生产环境务必设为 false;第三个参数 verbose 设为 true 可看 SQL 日志。
模型字段名必须首字母大写,否则 ORM 无法识别 —— 这是 Go 的导出规则,不是 Beego 特性。
最常被忽略的一点:app.conf 里配置项要用双冒号分隔,比如 db::host,而不是 db.host 或 db.host —— Beego 的 AppConfig 默认用 :: 当分隔符。










