Go 框架三件套详解(Web/RPC/ORM) | 青训营笔记

68 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第4天

声明模型以及连接

声明模型

首先我们知道模型是标准的struct,Gorm使用结构体名的蛇形复数作为表名,下面以一个model为例:

type User struct 
{   
    ID        uint           `gorm:"primaryKey"`   
    CreatedAt time.Time   
    UpdatedAt time.Time   
    DeletedAt gorm.DeletedAt `gorm:"index"`   
    Name string 
}

这里我们可以看到声明ID为主键以及声明了以deleteat为排序规则的索引,然后就是一些正常的声明了,注意,我们这里没有增加约束,具体增加规则请看gorm的官方文档

连接

dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

这里只写了一个最简单的数据库连接,这里其实我们还有很多自定义驱动没有将,但是由于篇幅原因就在此赘述了

CRUD

创建

批量插入

var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} db.Create(&users)

根据Map创建

db.Model(&User{}).Create([]map[string]interface{} {
    {"Name": "jinzhu_1", "Age": 18},   
    {"Name": "jinzhu_2", "Age": 20}, 
})

简单的插入

db.Model(&User{}).Create(&user)

查询

查询单个记录

db.First(&user)
// ...

还有许多查询单个记录的语句,具体请看文档

根据主键检索

db.First(&user, 10)

检索全部对象

result := db.Find(&users)

条件查询

db.Where("name = ?", "jinzhu").First(&user)

查询name="jinzhu"的所有user,所以我们只需要再where里面写好条件即可,其中有in、like、and、or之类的。并且我们还可以用Struct和Map放到where里面进行查询

// Struct 
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user) 
// Map 
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users) 
// Slice
db.Where([]int64{20, 21, 22}).Find(&users)

还有很多高级查询也请大家查询文档

更新

保存所有字段

db.Save(&user)

这样就能保存user的所有字段,即使字段为零值

更新单个列

db.Model(&user).Where("active = ?", true).Update("name", "hello")

这段代码的意思就是改变active为true的记录的name为hello

更新多列

根据struct和map我们可以更新多个字段,当使用struct更新时,默认情况下GORM只会更新非零值的字段

db.Model(&user).Updates(User{Name:"hello", Age:18})

db.Model(&user).Updates(map[string]interface{Name:"hello", Age:18})

删除

删除一条记录

db.Where("name=?", "jinzhu").Delete(&email)

以上是带额外条件的删除

批量删除

db.Where("name=?", "jinzhu").Delete(&Email{})

软删除

如果包含了gorm.deleteat字段,那么它自动获得软删除记录;此时我们如果使用sql删除的话,那么记录不会在数据库真正删除,但是我们不能通过普通的查询方法找到该记录

永久删除

db.Unscoped().Delete(&order)

这样我们就可以使用Unscoped永久删除匹配的记录

总结

在这篇文章,我只写了一些简单的crud,更多细节比如事务等请大家到gorm官方文档查阅gorm.io/zh_CN/docs/…