beego 是一个用于Go编程语言的开源、高性能的 web 框架
beego 被用于在Go语言中企业应用程序的快速开发,包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado, Sinatra 和 Flask
beego 官网:http://beego.gocn.vip/
上面的 beego 官网如果访问不到,看这篇文章《beego 官网文档本地环境搭建》
注意:本文的 beego 文档使用的就是本地环境搭建的文档,因为官网文档已经不可用了
beego 官方 github 仓库:https://github.com/beego/beego
上一讲,讲了 beego 页面视图,需要的朋友可以查看《Beego 使用教程 8:Session 和 Cookie》
这一讲,讲解 ORM 操作数据库。代码使用上一讲的代码
1、基本使用
新建数据库 beego-demo-db,建表 sql 看下面
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
安装依赖,执行下面命令
go get github.com/go-sql-driver/mysql
go mod tidy
在项目根目录下,新建dao文件目录,在dao 目录下新建 user.go,user.go 代码是下面内容
package dao
import (
"github.com/beego/beego/v2/client/orm"
//匿名引入mysql驱动
_ "github.com/go-sql-driver/mysql"
)
type User struct {
Id int `orm:"auto"`
Name string `orm:"column(name)"`
Age int `orm:"column(age)"`
}
func init() {
// 注册 User 结构体模型
orm.RegisterModel(new(User))
orm.RegisterDataBase("default", "mysql", "root:123456@tcp(192.168.3.232:3306)/beego-demo-db?charset=utf8")
}
func Add() {
o := orm.NewOrm()
user := new(User)
user.Name = "贾元春"
user.Age = 25
// 添加数据
o.Insert(user)
}
在 controller 目录下新建 dao.go ,dao.go 代码是下面
package controller
import (
"beego-demo/dao"
"github.com/beego/beego/v2/server/web"
"github.com/beego/beego/v2/server/web/context"
)
func RegisterDaoRoutes() {
web.Get("/user/add", func(ctx *context.Context) {
dao.Add()
ctx.WriteString("添加成功")
})
}
运行测试
浏览器访问:http://localhost:9090/user/add
2、数据库设置
最大连接数
最大连接数的设置有两种方式,一种方式是在注册数据库的时候,使用MaxOpenConnections 选项
orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", orm.MaxOpenConnections(100))
也可以在注册之后修改
orm.SetMaxOpenConns("default", 30)
最大空闲连接数
最大空闲连接数的设置有两种方式,一种方式是在注册数据库的时候,使用MaxIdleConnections选项
orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", orm.MaxIdleConnections(20))
注册之后修改
orm.SetMaxIdleConns("default", 30)
3、注册驱动
大多数时候,你只需要使用默认的那些驱动,有
DRMySQL // mysql DRSqlite // sqlite DROracle // oracle DRPostgres // pgsql DRTiDB // TiDB
如果你需要注册自定义的驱动,可以使用
// 参数1 driverName
// 参数2 数据库类型
// 这个用来设置 driverName 对应的数据库类型
// mysql / sqlite3 / postgres / tidb 这几种是默认已经注册过的,所以可以无需设置
orm.RegisterDriver("mysql", yourDriver)
4、模型定义与注册
Beego 的 ORM 模块要求在使用之前要先注册好模型,并且 Beego 会执行一定的校验,用于辅助检查模型和模型之间的约束。并且模型定义也会影响自动建表功能自动建表
Beego 的模型定义,大部分都是依赖于 Go 标签特性,可以设置多个特性,用;分隔。同一个特性的不同值使用,来分隔
orm:"null;rel(fk)"
注册模型有三个方法
4.1、模型基本设置
表名
默认的表名规则,使用驼峰转蛇形
AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user
除了开头的大写字母以外,遇到大写会增加 _,原名称中的下划线保留
也可以自定义表名,只需要实现接口TableNameI
type User struct {
Id int
Name string
}
func (u *User) TableName() string {
return "auth_user"
}
同时,也可以在注册模型的时候为表名加上前缀或者后缀
列
为字段设置 DB 列的名称
Name string `orm:"column(user_name)"`
忽略字段
设置 - 即可忽略模型中的字段
type User struct {
// ...
AnyField string `orm:"-"`
//...
}
索引
默认情况下,可以在字段定义里面使用 Go 的标签功能指定索引,包括指定唯一索引。
例如,为单个字段增加索引
Name string `orm:"index"`
或者,为单个字段增加 unique 键
Name string `orm:"unique"`
实现接口TableIndexI,可以为单个或多个字段增加索引
type User struct {
Id int
Name string
Email string
}
// 多字段索引
func (u *User) TableIndex() [][]string {
return [][]string{
[]string{"Id", "Name"},
}
}
// 多字段唯一键
func (u *User) TableUnique() [][]string {
return [][]string{
[]string{"Name", "Email"},
}
}
主键
可以用auto显示指定一个字段为自增主键,该字段必须是 int, int32, int64, uint, uint32, 或者 uint64
MyId int32 `orm:"auto"`
如果一个模型没有定义主键,那么 符合上述类型且名称为 Id 的模型字段将被视为自增主键。
如果不想使用自增主键,那么可以使用pk设置为主键
Name string `orm:"pk"`
注意,目前 Beego 的非自增主键和联合主键支持得不是特别好。建议普遍使用自增主键
鉴于 go 目前的设计,即使使用了 uint64,但你也不能存储到他的最大值。依然会作为 int64 处理
默认值
默认值是一个扩展功能,必须要显示注册默认值的Filter,而后在模型定义里面加上default的设置
import (
"github.com/beego/beego/v2/client/orm/filter/bean"
"github.com/beego/beego/v2/client/orm"
)
type DefaultValueTestEntity struct {
Id int
Age int `default:"12"`
AgeInOldStyle int `orm:"default(13);bee()"`
AgeIgnore int
}
func XXX() {
builder := bean.NewDefaultValueFilterChainBuilder(nil, true, true)
orm.AddGlobalFilterChain(builder.FilterChain)
o := orm.NewOrm()
_, _ = o.Insert(&User{
ID: 1,
Name: "Tom",
})
}
自动更新时间
Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
- auto_now 每次 model 保存时都会对时间自动更新
- auto_now_add 第一次保存时才设置时间
对于批量的 update 此设置是不生效的
引擎
仅支持 MySQL,只需要实现接口TableEngineI。
默认使用的引擎,为当前数据库的默认引擎,这个是由你的 mysql 配置参数决定的。
你可以在模型里设置 TableEngine 函数,指定使用的引擎
type User struct {
Id int
Name string
Email string
}
// 设置引擎为 INNODB
func (u *User) TableEngine() string {
return "INNODB"
}
null
数据库表默认为 NOT NULL,设置 null 代表 ALLOW NULL
Name string `orm:"null"`
size
string 类型字段默认为 varchar(255)
设置 size 以后,db type 将使用 varchar(size)
Title string `orm:"size(60)"`
digits / decimals
设置 float32, float64 类型的浮点精度
Money float64 `orm:"digits(12);decimals(4)"`
总长度 12 小数点后 4 位 eg: 99999999.9999
type
设置为 date 时,time.Time 字段的对应 db 类型使用 date
Created time.Time `orm:"auto_now_add;type(date)"`
设置为 datetime 时,time.Time 字段的对应 db 类型使用 datetime
Created time.Time `orm:"auto_now_add;type(datetime)"`
Precision
为datetime
字段设置精度值位数,不同 DB 支持最大精度值位数也不一致
type User struct {
...
Created time.Time `orm:"type(datetime);precision(4)"`
...
}
Comment
为字段添加注释
type User struct {
...
Status int `orm:"default(1);description(这是状态字段)"`
...
}
注意: 注释中禁止包含引号
4.2、模型字段与数据库类型的映射
在此列出 ORM 推荐的对应数据库类型,自动建表功能也会以此为标准。
默认所有的字段都是 NOT NULL
这里只列出来 mysql 数据库的对应类型,更多的数据库请查看官方文档
下一讲:《Beego 使用教程 10:ORM 操作数据库(下)》
至此完