这是我参与「第五届青训营 」笔记创作活动的第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/…