GORM学习笔记(2) | 青训营笔记

78 阅读3分钟

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语句基本一致,用起来很方便