脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go GORM版本2.0新特性介绍

Go GORM版本2.0新特性介绍

2022-10-17 11:14王中阳Go Golang

这篇文章主要为大家介绍了Go GORM版本2.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 支持

?
1
db.WithContext(ctx).Find(&users)

批量插入

老版本的批量插入很是恶心,新版本还是非常友好的

我们可以直接将切片slice传递给Create方法

?
1
2
3
4
5
var users = []User{{Name: "user1"}, {Name: "user2"}, {Name: "user3"}}
db.Create(&users)
for _, user := range users {
  user.ID // 1,2,3
}

还可以方便的创建测试数据,使用 CreateInBatches 创建

?
1
2
3
var users = []User{name: "user_1"}, ...., {Name: "user_10000"}}
// 数量为 100
db.CreateInBatches(users, 100)

预编译模式

预编译Sql执行语句,以加速后续的执行效率

?
1
2
3
4
5
6
7
// 全局模式,所有的操作都会创建并缓存预编译语句,以加速后续执行速度
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失败

?
1
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集合中,更方便,更灵活

?
1
2
var result map[string]interface{}
db.Model(&User{}).First(&result, "id = ?", 1)

Create From Map

根据 map[string]interface{} 或 []map[string]interface{} Create

?
1
2
3
4
5
6
7
8
//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)

事务嵌套

?
1
2
3
4
5
6
7
8
9
10
11
12
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
})

远远不止上面这些,更多关于Go GORM版本2.0特性的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/6945404499850854408

延伸 · 阅读

精彩推荐
  • Golanggolang中使用sync.Map的方法

    golang中使用sync.Map的方法

    这篇文章主要介绍了golang中使用sync.Map的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 ...

    IT技术小小鸟9432020-08-21
  • Golang详解Golang中下划线的使用方法

    详解Golang中下划线的使用方法

    这篇文章主要介绍了详解Golang中下划线的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    happen3832020-05-22
  • Golang总结Go语言中defer的使用和注意要点

    总结Go语言中defer的使用和注意要点

    Go语言中的defer关键字实现比较特殊的功能,这篇文章给大家总结了关于Go语言中defer的使用和注意要点,有需要的朋友们可以参考借鉴,下面来一起看看吧...

    daisy4742020-05-01
  • GolangGo语言编程学习golang配置golint

    Go语言编程学习golang配置golint

    这篇文章主要为大家介绍了Go语言编程学习golang配置golint的过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职...

    秋天的春3532021-12-03
  • Golanggo语言执行windows下命令行的方法

    go语言执行windows下命令行的方法

    这篇文章主要介绍了go语言执行windows下命令行的方法,实例分析了Go语言操作windows下命令行的技巧,需要的朋友可以参考下 ...

    令狐不聪7052020-04-22
  • Golanggolang 如何删除二进制文件中的源码路径信息

    golang 如何删除二进制文件中的源码路径信息

    这篇文章主要介绍了golang 如何删除二进制文件中的源码路径信息,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    ishouyong9162021-06-10
  • GolangGolang 处理浮点数遇到的精度问题(使用decimal)

    Golang 处理浮点数遇到的精度问题(使用decimal)

    本文主要介绍了Golang 处理浮点数遇到的精度问题,不使用decimal会出大问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们...

    头秃猫轻王4022022-09-04
  • GolangGo语言的Channel遍历方法详解

    Go语言的Channel遍历方法详解

    这篇文章主要介绍了Go语言的Channel遍历方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    cqu_jiangzhou4402021-06-07