Gorm 常用操作总结

摘要:由于在实习的工作中,采用的是 Go 语言,数据库操作采用的 ORM 框架是 Gorm, 所以就来总结一下使用过程中遇到的一些问题。

基本操作

Save

当匹配主键的数据不存在时,它的效果是插入一条新数据,而当匹配的主键存在时,则更新全部字段。无论字段是否做了修改或者是定义类型的默认值。

package model

const UserTable = "t_user"

type User struct {
    Id           int     `gorm:"column:id; type:int(11);primary_key"`
    Name         string  `gorm:"column:name; type:varchar(32);"`
    Age          int     `gorm:"column:age; type:int(11);"`
    Description  string  `gorm:"column:description; type:varchar(512);"`
}

func (User) TableName() string {
    return UserTable
}

note: 特别注意 Id 的定义中的 primary_key, 如果没有加这个 Save 方法是无法正常工作的。

note: 如果在定义时,没有给 Age 赋值,那么这条数据的 Age 将被置为 0。

note: 可以通过判断传入的主键字段是否为空来觉得是否要将此字段加入到结构体中,如果不为空,加入结构体,此时:找到则更新;如果为空,则会新建。

用处:不用显示判断是新增数据还是更新数据,可以让代码更加简洁。

func (User) SaveOne(db *gorm) {
    user := User{Id:1, Name:"Tom", Age:18, Description:"A Man"}
    if err := db.Save(&user).Error; err != nil {
        fmt.Errorf("Save user failed, err: %+v
", err)
        return
    }
}
// id 为主键
// 当记录不存在时,执行的 Sql 语句是:
insert into t_user(id, name, age, description) value (1, "Tom", 18, "A Man")
// 当记录存在时,执行的 Sql 语句是:
update t_user set name = "Tom", age = 18, description = "A Man" where id = 1

Where

Gorm 的一个非常好用的特征就是链式查询,在不同条件下需要有不同的查询条件这样的场景中,利用该特征能帮助我们大大简化代码。

func (User) FindQuery(query *gorm.DB, installId, appId string) *gorm.DB {
    query = query.Where("install_id = ?", installId)
    if appId != "" {
        query = query.Where("app_id = ?", appId)
    }
    return query
}

参考资料:

https://juejin.im/post/5d29988e6fb9a07efc49b612

原文地址:https://www.cnblogs.com/zpcoding/p/12615345.html