0 前言
这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
这个笔记主要是记录GORM的一些常用的增删改查的用法
1 创建记录
1.1 通过 create 创建一条记录
func CreateAccount(username string, password string) (uid int64, err error) {
user := Account{
Username: username,
Password: password,
FollowCount: 0,
FollowerCount: 0,
}
result := DB.Create(&user)
if result.Error != nil {
return 0, result.Error
}
return int64(user.ID), nil
`
user.ID // 返回插入数据的主键
result.Error // 返回 error
result.RowsAffected // 返回插入记录的条数
`
}
以上是创建一条 Account 记录的方式,首先声明一个Account结构体,并对其进行赋值,随后在create中传入这个结构体的指针作为参数,GORM就可以根据这个结构体找到结构体对应的表,并在表中创建出对应的记录
另外,如果传入的是结构体切片,如 [ ]Account,则还可以进行批量的数据插入操作,一次性插入多条数据
1.2 选择部分字段进行创建的方式(使用Select选择要使用的字段)
db.Select("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775")
1.3 忽略部分字段进行创建(使用Omit忽略不用的字段)
db.Omit("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775")
2 删除记录
2.1 通过Delete删除记录
followerInfo := Follower{
Id: id,
FollowerId: followerId,
}
result := DB.Delete(&followerInfo)
//等效于
result := DB.Where("Id = ? AND FollowerId = ?", id, followerid).Delete(&Follower{})
注意,Delete会将所有符合条件的记录都进行删除
2.2 硬删除和软删除
硬删除就是我们常见的直接将记录从数据库中移除,那么什么是软删除呢?
如果你的结构体中包含了 gorm.Model,如:
type VideoInfo struct {
gorm.Model
AuthorId int64
PlayUrl string
CoverUrl string
FavoriteCount int64
CommentCount int64
Title string
}
在gorm.Model中包含有一个属性 DeletedAt,则在使用GORM进行Delete操作时会进行软删除,即实际上数据并没有从数据库中移除,而是将DeletedAt字段设置为删除的时间,会由GORM进行维护,这就是软删除
3 修改记录
3.1 通过Save更新记录 我比较常用的方式是Save方法
db.First(&user)
user.Name = "jinzhu 2"
user.Age = 100
db.Save(&user)
// UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111;
首先通过查询找到我们需要的结构体,然后对获得的结构体进行修改,最后通过Save保存结构体的所有字段
3.2 通过Update更新记录
// User 的 ID 是 `111`
db.Model(&user).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;
4 查询记录
4.1 First、Last、Take、Find
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;
// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
// 获取所有符合条件的记录
db.Find(&user)
// SELECT * FORM users
result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error // returns error or nil
// 检查 ErrRecordNotFound 错误
error
s.Is(result.Error, gorm.ErrRecordNotFound)
4.2 通过Where限定条件
// Get first matched record
db.Where("name = ?", "jinzhu").First(&user)
// SELECT * FROM users WHERE name = 'jinzhu' ORDER BY id LIMIT 1;
// Get all matched records
db.Where("name <> ?", "jinzhu").Find(&users)
// SELECT * FROM users WHERE name <> 'jinzhu';
// 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 >= ?", "jinzhu", "22").Find(&users)
// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;
// Time
db.Where("updated_at > ?", lastWeek).Find(&users)
// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';
// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';
where中可以设置很多的条件,语法跟SQL语句基本一致,用起来很方便