gorm学习使用(2) | 青训营

102 阅读2分钟

昨天已经聊了聊关于create和delete的内容,今天则主要说说update和select的内容,并且结合自己的项目的内容来说说如何应用gorm在实践中。

select

select的类型有很多,包括单个,多个等;

查询一条数据:

当我们的业务要求是只获得某一条数据的时候,我们可以用First,Take,Last这几个方法来实现。它们的不同在于,first相当于order by ,last相当于order by xx desc,take则什么都不加。

// 获取第一条记录first,等同于SELECT * FROM users ORDER BY id LIMIT 1; 
db.First(&user)

// 获取一条记录,没有指定排序字段,等同于SELECT * FROM users LIMIT 1; 
db.Take(&user)

// 获取最后一条记录(主键降序),等同于SELECT * FROM users ORDER BY id DESC LIMIT 1;
db.Last(&user)

// 检查 ErrRecordNotFound 错误,result是查询的返回值
errors.Is(result.Error, gorm.ErrRecordNotFound) 

查询多条数据

当要查询多条的时候,可以用Find()方法

result:=db.Find(&users)
//该代码等同于select * from users

那如果我们想要带上条件来查询该怎么办呢?

db.Where("name=?","xbt").Find(&user)
//该代码等价于select * from users where name = "xbt"

db.Where("age<?",20).Find(&users)
//select * from users where age<20;

这里有个注意点,当我们用first等单个查询的时候,引用里面是user,当是多查询的时候,应用里面是users;还有一个注意点是Where的第一个字母需要大写,不要含糊了


同时,Find方法是支持结构体和切片的数据的,而且使用find的时候可以避免ErrRecordNotFound的问题。

在实际使用中,我们可以是使用主键检索居多的。当我们要根据主键检索的时候,我们不想要总是写where,想要节省一些力气可以吗?gorm也是考虑到了这个问题,所以它就附带了主键检索的专门方式,下面是个例子

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)

update

更新一条数据可以用save
关于save:save是一个组合功能。如果保存值不包含主键,它将执行 Create,否则将执行 Update(包含所有字段)。

db.First(&user)
user.Name = "cyj"
user.Age = 25
db.Save(&user)  
// UPDATE users SET name='cyj', age=25, birthday='2003-06-01', updated_at = '2023-8-17 21:34:10' WHERE id=2;

也可以带Model方法,但是我并没有非常的理解Model方法。在它的官网是这样解释的:

使用 Update 更新单个列时,它需要具有任何条件,否则将引发错误 ErrMissingWhereClause,请查看阻止全局更新以获取详细信息。当使用 Model 方法并且其值具有主值时,主键将用于生成条件,例如:

db.Model(&user{}).Where("age=?",19).Update("name","xiaowang")
//update users set name="xiaowang" where age=19;

综上,则讲述了gorm的基本使用方法,后续的高阶使用可以在根据gorm.io来学习。