非零基础快速入门Go 语言数据库中间件_ GORM
Java中有 Mybatis Go 中自然有与之对标的中间件 GORM
本文参考 Gorm 官网,以最快的速度上手 Go针对数据库的增删改查
由于现在针对数据库中间件更多只是使用其单表功能 因为让数据库做复杂运算会造成性能压力 所以我们更多的将数据的运算下放到业务逻辑中处理 所以我抛去了很多中间件的高级特性
GORM 是一个全功能 ORM (Object/Relation Mapping)框架
说是 ORM 框架,我们自然先声明出我们的 Obeject
模型定义
模型是标准的 struct
type User struct {
ID uint
Name string
Email *string
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
约定大于配置
GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID
作为主键,使用结构体名的 蛇形复数
作为表名,字段名的 蛇形
作为列名,并使用 CreatedAt
、UpdatedAt
字段追踪创建、更新时间
遵循 GORM 已有的约定,可以减少您的配置和代码量
创建
创建记录
//Object
user := User{
Name: "Jinzhu", Age: 18, Birthday: time.Now()}
//通过数据的指针来创建
result := db.Create(&user)
user.ID // 返回插入数据的主键
result.Error // 返回 error
result.RowsAffected // 返回插入记录的条数
批量插入
要有效地插入大量记录,请将一个 slice
传递给 Create
方法。 将切片数据传递给 Create 方法,GORM 将生成一个单一的 SQL 语句来插入所有数据,并回填主键的值,钩子方法也会被调用。
var users = []User{
{
Name: "jinzhu1"}, {
Name: "jinzhu2"}, {
Name: "jinzhu3"}}
db.Create(&users)
for _, user := range users {
user.ID // 1,2,3
}
查询
检索单个对象
GORM 提供了 First
、Take
、Last
方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1
条件,且没有找到记录时,它会返回 ErrRecordNotFound
错误
如果你想避免ErrRecordNotFound
错误,你可以使用Find
,比如db.Limit(1).Find(&user)
,Find
方法可以接受struct和slice的数据。
First
, Last
方法将按主键排序查找第一/最后一条记录,只有在用struct查询或提供model value时才有效,如果当前model没有定义主键,将按第一个字段排序,例如:
用主键检索
如果主键是数值类型
db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;
db.Find(&users, []int{
1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);
如果主键是像 uuid 这样的字符串,您需要这要写:
db.First(&user, "id = ?", "1b74413f-f3b8-409f-ac47-e8c062e3472a")
// SELECT * FROM users WHERE id = "1b74413f-f3b8-409f-ac47-e8c062e3472a";
检索全部对象
// 获取全部记录
result := db.Find(&users)
// SELECT * FROM users;
result.RowsAffected // 返回找到的记录数,相当于 `len(users)`
result.Error // returns error
添加查询条件
// 获取第一条匹配的记录
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;
// IN
db.Where("name IN (?)", []string{
"jinzhu", "jinzhu 2"}).Find(&users)
// SELECT * FROM users WHERE name IN ('jinzhu','jinzhu 2');
// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%jin%';
// AND
db.Where("name = ? AND age >