美文网首页
Go 是时候升级gorm啦

Go 是时候升级gorm啦

作者: 王中阳 | 来源:发表于2021-03-30 19:41 被阅读0次

    今天是公元2021年3月30日,坊间流传PHP的git服务器被黑客攻入,因恶意代码服务器将关停,PHP还是世界上最好的语言吗?不知道,我是转Go了。

    今天本来是想写gorm相关的知识点的,遇到了批量插入的问题,发现很不科学,才发现gorm已经出了新版本2.0版本,最新的Tag是v1.21.6,我目前使用的是v1.9.10。

    下面介绍新版本的特性

    GORM 2.0 完全从零开始,引入了一些不兼容的 API 变更和许多改进。

    Context 支持

    • 通过 WithContext 方法提供 context.Context 支持
    db.WithContext(ctx).Find(&users)
    

    批量插入

    • 老版本的批量插入很是恶心,新版本还是非常友好的
    • 我们可以直接将切片slice传递给Create方法
    var users = []User{{Name: "user1"}, {Name: "user2"}, {Name: "user3"}}
    db.Create(&users)
    
    for _, user := range users {
      user.ID // 1,2,3
    }
    
    • 还可以方便的创建测试数据,使用 CreateInBatches 创建
    var users = []User{name: "user_1"}, ...., {Name: "user_10000"}}
    
    // 数量为 100
    db.CreateInBatches(users, 100)
    

    预编译模式

    • 预编译Sql执行语句,以加速后续的执行效率
    // 全局模式,所有的操作都会创建并缓存预编译语句,以加速后续执行速度
    db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{PrepareStmt: true})
    
    // 会话模式,当前会话中的操作会创建并缓存预编译语句
    tx := db.Session(&Session{PrepareStmt: true})
    tx.First(&user, 1)
    tx.Find(&users)
    tx.Model(&user).Update("Age", 18)
    

    Joins 预加载

    • 1.0版本预加载只能使用的Preload,预加载部分升级还是比较大的
    • 使用 Inner Join 预加载关联,处理null数据,避免scan失败
    db.Joins("Company").Joins("Manager").Joins("Account").Find(&users, "users.id IN ?", []int{1,2})
    

    Find to Map

    • 这里让我想到了laravel的ORM(Eloquent),它做了一层封装支持直接返回集合,而不是PHP常用的数组
    • 这里的 Find to Map 支持直接把结果赋值到map集合中,更方便我们输出结果,更灵活
    var result map[string]interface{}
    db.Model(&User{}).First(&result, "id = ?", 1)
    

    Create From Map

    • 根据 map[string]interface{} 或 []map[string]interface{} Create
    //map[string]interface{} 示例
    db.Model(&User{}).Create(map[string]interface{}{"Name": "user", "Age": 18})
    
    //[]map[string]interface{} Create 示例
    datas := []map[string]interface{}{
      {"Name": "user_1", "Age": 19},
      {"name": "user_2", "Age": 20},
    }
    
    db.Model(&User{}).Create(datas)
    

    事务嵌套

    db.Transaction(func(tx *gorm.DB) error {
      tx.Create(&user1)
    
      tx.Transaction(func(tx2 *gorm.DB) error {
        tx.Create(&user2)
        return errors.New("rollback user2") // rollback user2
      })
    
      tx.Transaction(func(tx2 *gorm.DB) error {
        tx.Create(&user3)
        return nil
      })
    
      return nil // commit user1 and user3
    })
    

    ...

    远远不止上面这些,明天继续更新博客。

    Last But Not Least

    真心感谢帅哥美女们能看到这里,如果觉得这篇文章写得还不错😄

    求点赞👍 ,求关注❤️ ,求分享👥 ,对想成为海贼王的我来说非常有用!!!

    如果能关注我公众号的话,那我比彩票中奖还高兴 ❤️❤️❤️❤️

    欢迎关注我的公众号

    相关文章

      网友评论

          本文标题:Go 是时候升级gorm啦

          本文链接:https://www.haomeiwen.com/subject/hdnghltx.html