1. Model介绍
beego ORM 是一个强大的 Go 语言 ORM 框架,orm模块主要是处理MVC中的M(models)
对象-关系映射(Object-Relational Mapping,简称ORM)。当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存、删除、读取对象信息,而这些代码都是重复的。而使用ORM则会大大减少重复性代码。
ORM的特性:
- 支持范围广:支持 Go 的所有类型存储
- 上手容易:采用简单的 CRUD 风格,允许直接使用 SQL 查询/映射
- 兼容性好:跨数据库兼容查询
- 自动 Join 关联表
2. 基本应用
2.1 数据库设置
首先需要安装orm模块和mysql驱动:
// 安装beego orm包
go get github.com/astaxie/beego/orm
// 安装mysql驱动
go get github.com/go-sql-driver/mysql
同时,也需要导入包:
接下来是配置连接信息,配置过程和GoWeb实战1方法相似:
数据库注册函数的原型如下:
参数名 | 说明 |
---|---|
aliasName | 数据库的别名,用来在 ORM 中切换数据库使用 |
driverName | 驱动名字 |
dataSource | 数据库连接字符串 |
params | 附加参数 |
常用的附加参数有:
参数名 | 默认值 | 说明 |
---|---|---|
charset | none | 设置字符集,相当于 SET NAMES |
loc | UTC | 设置时区,可以设置为Local,表示根据本地时区走 |
parseTime | false | 是否需要将 mysql的 DATE 和 DATETIME 类型值转换成GO的time.Time类型。 |
readTimeout | 0 | I/O 读超时时间, sql查询超时时间. 单位 (“ms”, “s”, “m”, “h”), 例子: “30s”, “0.5m” or “1m30s”. |
timeout | 0 | 连接超时时间,单位(“ms”, “s”, “m”, “h”), 例子: “30s”, “0.5m” or “1m30s”. |
2.2 准备工作
首先我们创建一个表,用于测试:
id为无符号整形,长度最长为10,不允许空NOT NULL
,自增。varchar
是可变字符串类型。datetime
类型用于存储时间,存储方式是:
YYYY-MM-DD HH:MM:SS
建完后可以看到:
接下来需要构建结构体承载数据:
ORM中结构体和表明的转化规则是驼峰转蛇形,除了开头以外,遇到大写需要_
代替:
AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user
所以,ShopId
对应的是shop_id
,又因为UserId
在表中对应的是customer_id
,不匹配,所以需要通过orm标签指定表字段名。
然后我们再为结构体添加一个函数,指定Order结构体默认绑定的表名:
最后在main函数中,注册模型
除了前面提到的用column设置名字外,还有其他有用的参数设置:
- 忽略字段
-
- 设置自增键
auto
- 设置为主键
pk
- 在数据库默认非空下,允许为空
null
比如:
2.3 CRUD操作
(1)插入数据
单条插入:
批量插入:
(2)更新数据
更新所有字段:
更新指定字段:
(3)查询数据
(4)删除数据
3. 高级查询
首先重新定义一个用户表
然后再定义结构体:
3.1 过滤查询
过滤查询主要用的是QuerySeter
,下面是一个简单的条件查询,查询来自武汉的且生成时间晚于2020年的用户:
可以看到Filter能连携使用,还能处理大于小于等条件。使用等于条件时:
使用不等条件时,用双下划线 __ 作为分隔符,尾部连接操作符:
此外还有其他操作符:
- exact / iexact 等于,i表示大小写不敏感
- contains / icontains 包含,i表示大小写不敏感
- gt / gte 大于 / 大于等于
- lt / lte 小于 / 小于等于
- startswith / istartswith 以…起始
- endswith / iendswith 以…结束
- in 在其中
- isnull
比如:
3.2 复杂查询
有的时候我们需要将条件组合起来查询,上面的例子多个Filter函数调用只能生成and连接的查询条件。beego orm为我们提供了Condition对象,用于生成查询条件。
此外还可以连协Count,Group等功能: