01
介绍
beego ORM 是一个强大的 Go 语言 ORM 框架。她的灵感主要来自
Django ORM 和 SQLAlchemy。
已支持的数据库驱动有MySQL、PostgreSQL 和 Sqlite3。
beego v2.x 和 beego v1.x 在 ORM 上的区别是,beego v2.x 的 ORM 对象被设计为无状态的,它是线程安全的,建议大家在使用时,一个数据库只对应一个 ORM 对象。
本文全篇都是以 MySQL 为例。
02
安装
如果您使用的是 beego 框架,beego ORM 已默认安装,如果您没有使用 beego 框架,可使用 go get 安装 beego ORM:
go get github.com/astaxie/beego/client/orm
03
注册
- 注册驱动
orm.RegisterDriver("mysql", orm.DRMySQL)
- 参数 1 是驱动名称,参数 2 是驱动类型,需要注意的是,不要忘记导入 MySQL 驱动。
import _ "github.com/go-sql-driver/mysql"
- 注册数据库
orm.RegisterDataBase("default", "mysql", "root:root@/beego_web?charset=utf8&loc=Local")
- beego ORM 必须注册一个别名为 default 的数据库,作为默认使用。参数 1 是数据库的别名,用来在 ORM 中切换数据库使用,参数 2 是驱动名称,参数 3 是对应的 dataSource。
使用 go-sql-driver,驱动默认使用UTC 时间,如需使用本地时间,请设置 loc 的值为 Local。
- 设置数据库最大空闲连接数
orm.SetMaxIdleConns("default", 10)
- 根据数据库的别名,设置数据库的最大空闲连接数。
- 设置数据库最大连接数
orm.SetMaxOpenConns("default", 10)
- 根据数据库的别名,设置数据库的最大连接数。
- 注册模型
orm.RegisterModel(new(User))
- 注册模型,同时注册多个模型,使用英文逗号分隔。
- 使用表前缀注册模型
orm.RegisterModelWithPrefix("beego_", new(User))
- 使用表前缀注册模型,同时注册多个模型,使用英文逗号分隔。
注册模型和使用表前缀注册模型,不可同时使用,重复注册模型,会导致成程序 panic。
04
自动建表
- 默认表名默认的表名规则,是使用驼峰转蛇形,除了开头的大写字母外,遇到大写字母会增加下划线,并且原名已存在的下划线继续保留。
AuthUser -> auth_user Auth_User -> auth__user DB_AuthUser -> d_b__auth_user
- 自定义表名
func (u *User) TableName() string { return "user" }
- 如果设置了表前缀,自定义表名会在开头拼接上前缀。
- 自定义存储引擎
func (u *User) TableEngine() string { return "INNODB" }
- 默认使用 MySQL 数据库设置的存储引擎,如果您需要在程序中指定存储引擎,可以使用以上方式设置。
- 设置参数
type User struct { Id uint64 `form:"-" orm:"auto;pk;description(主键 ID)"` Name string `form:"name" orm:"unique;size(30)";description(用户名)` Age uint8 `orm:"index;description(年龄)"` Created time.Time `orm:"auto_now_add;type(datetime)"` Updated time.Time `orm:"auto_now;type(datetime)"` }
- 在结构体中,可以使用 orm 标签设置数据库的属性,限于篇幅,具体使用方法请参考官方手册。
- 自动建表
err := orm.RunSyncdb("default", false, true) if err != nil { log.Fatalln(err.Error()) return }
参数 1 是数据库别名,参数 2 是布尔类型的 force,参数 3 是布尔类型的 verbose。force 为 true 代表 drop table 后再建表;verbose 为 true 代表打印建表的执行过程。
自动建表功能在 force 为 false 时,会自动创建新增的字段和索引。删除或修改操作,需要用户自行手动处理。
05
新增
单条插入:
func (u *UserController) Create() { o := orm.NewOrm() // 创建一个 Ormer name := u.GetString("name", "unknow") age, _ := u.GetUint8("age", 0) user := &models.User{ Name: name, Age: age, } id, err := o.Insert(user) if err != nil { log.Fatalln(err.Error()) return } fmt.Println("id:", id) }
Insert 方法插入单条数据,接收参数必须是指针类型,返回值有两个,分别是自增id 和 err。
批量插入:
func (u *UserController) Create() { o := orm.NewOrm() // 创建一个 Ormer users := []models.User{} _ = json.Unmarshal(u.Ctx.Input.RequestBody, &users) rows, err := o.InsertMulti(2, users) if err != nil { log.Fatalln(err) return } fmt.Println("rows:", rows) }
InsertMulti 方法批量插入数据,参数 1 是批量插入的数量,参数 2 是 slice,参数 1 的值为 1 时,将会按照顺序插入 slice 中的数据。返回值有两个,分别是插入行数和 err。
06
修改
func (u *UserController) Update() { web.BConfig.WebConfig.AutoRender = false o := orm.NewOrm() user := models.User{} _ = json.Unmarshal(u.Ctx.Input.RequestBody, &user) rows, err := o.Update(&user, "Name") if err != nil { log.Println(err.Error()) return } fmt.Println("rows:", rows) }
Update 方法更新数据,参数 1 是更新对象,参数 2 是更新的字段,多个字段用英文逗号分隔,默认更新多有字段。返回值有两个,分别是更新行数和err。
07
删除
func (u *UserController) Delete() { web.BConfig.WebConfig.AutoRender = false o := orm.NewOrm() id, _ := u.GetUint64("id", 0) user := models.User{ Id: id, } rows, err := o.Delete(&user) if err != nil { log.Println(err.Error()) return } fmt.Println("rows:", rows) }
Delete 方法删除数据,参数是删除对象,返回值有两个,分别是更新行数和 err。
08
总结
本文开篇介绍了 beego ORM 的设计思路和已支持的数据库驱动,并且介绍了 v2 和 v1 的区别,然后详细介绍了 beego ORM 的安装和使用方法。关于更多细节,请参阅官方手册。