Go GORM版本2.0新特性介绍

目录
  • 前言
  • 新版本的特性
    • Context 支持
    • 批量插入
    • 预编译模式
    • Joins 预加载
    • Find to Map
    • Create From Map
    • 事务嵌套

前言

公元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
})

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

(0)

相关推荐

  • golang gorm错误处理事务以及日志用法示例

    目录 1. 高级用法 1.1. 错误处理 1.2. 事物 1.2.1. 一个具体的例子 1.3. SQL构建 1.3.1. 执行原生SQL 1.3.2. sql.Row & sql.Rows 1.3.3. 迭代中使用sql.Rows的Scan 1.4. 通用数据库接口sql.DB 1.4.1. 连接池 1.5. 复合主键 1.6. 日志 1.6.1. 自定义日志 1. 高级用法 1.1. 错误处理 执行任何操作后,如果发生任何错误,GORM将其设置为*DB的Error字段 if err := d

  • golang gorm框架数据库的连接操作示例

    目录 1. 连接数据库 1.1 MySQL 1.2 PostgreSQL 1.3 Sqlite3 1.4 不支持的数据库 2. 迁移 2.1. 自动迁移 2.2. 检查表是否存在 2.3. 创建表 2.4. 删除表 2.5. 修改列 2.6. 删除列 2.7. 添加外键 2.8. 索引 1. 连接数据库 要连接到数据库首先要导入驱动程序.例如 import _ "github.com/go-sql-driver/mysql" 为了方便记住导入路径,GORM包装了一些驱动. import

  • gorm整合进go-zero的实现方法

    go-zero提供的代码生成器里面,没有提供orm框架操作,但是提供了遍历的缓存操作.但是gorm框架的话,没有比较好的缓存插件,虽然有一个gcache,但不支持gorm2.0版本. 所以我打算把这两个结合起来.在gorm官方文档中提到了一个接口,可以获取到生成的sql语句. 所以可以利用gorm当作一个sql语句的生成器,把生成后的sql语句放到go-zero生成的模板中去执行. gorm中的sql生成器 stmt := DB.Session(&Session{DryRun: true}).F

  • gorm+gin实现restful分页接口的实践

    目录 1. 定义分页struct 2. 数据表Model 3. 定义分页查询搜索的结构体 4. 分页和搜索数据查询 5.例子代码 API处理分页看似简单,实际上暗藏危机.最常见的分页方式,大概是下面这样的 页数表示法:/user/?page=1&size=15&name=李 偏移量表示法:/user/?offset=100&limit=15&name=李 使用页码表示法对前端开发比较友好,但是本质上是和偏移量表示发相似. 在这里我们将使用 jinzhu/gorm和 gin-

  • golang gorm的Callbacks事务回滚对象操作示例

    目录 1. Callbacks 1.1. 创建对象 1.2. 更新对象 1.3. 删除对象 1.4. 查询对象 1.5. 回调示例 1. Callbacks 您可以将回调方法定义为模型结构的指针,在创建,更新,查询,删除时将被调用,如果任何回调返回错误,gorm将停止未来操作并回滚所有更改. 1.1. 创建对象 创建过程中可用的回调 // begin transaction 开始事物 BeforeSave BeforeCreate // save before associations 保存前关

  • golang gorm更新日志执行SQL示例详解

    目录 1. 更新日志 1.1. v1.0 1.1.1. 破坏性变更 gorm执行sql 1. 更新日志 1.1. v1.0 1.1.1. 破坏性变更 gorm.Open返回类型为*gorm.DB而不是gorm.DB 更新只会更新更改的字段 大多数应用程序不会受到影响,只有当您更改回调中的更新值(如BeforeSave,BeforeUpdate)时,应该使用scope.SetColumn,例如: func (user *User) BeforeUpdate(scope *gorm.Scope) {

  • Go GORM版本2.0新特性介绍

    目录 前言 新版本的特性 Context 支持 批量插入 预编译模式 Joins 预加载 Find to Map Create From Map 事务嵌套 前言 公元2021年3月30日,坊间流传PHP的git服务器被黑客攻入,因恶意代码服务器将关停,PHP还是世界上最好的语言吗?不知道,我是转Go了. 本来是想写gorm相关的知识点的,遇到了批量插入的问题,发现很不科学,才发现gorm已经出了新版本2.0版本,最新的Tag是v1.21.6,我目前使用的是v1.9.10. 新版本的特性 GORM

  • C# 8.0新特性介绍

    C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新.同时,C# 每个版本的发布都与同时期的 Visual Studio 以及 .NET 运行时版本高度耦合,这也有助于开发者更好的学习掌握 C#,并将其与 Visual Studio 以及 .NET 的使用结合起来. 加快 C# 版本的发布速度 在被称为"新微软"的推动下,微软创新的步伐也加快了.为了做到加快步伐,微软开发部门将一些过去集成在一起的技术现在都分离了出来. Visual S

  • webpack 4.0.0-beta.0版本新特性介绍

    近年来前端技术如雨后春笋般蓬勃发展,我们也在这个潮流下不断地学习.成长.前端技术的不断发展,给我们提供了许多的便利.例如:JSX的出现为我们提供了一个清晰.直观的方式来描述组件树,LESS/SASS的出现提高了我们书写css的能力,AMD/CommonJS/ES6 的出现为我们模块化开发提供了便利.然而,我们需要使用其它工具将这些工具转化成原生语言以运行在浏览器上.为了能够更好的将这些不同的资源整合到一起,我们就需要一个打包工具,webpack就是这个需求下的产物. webpack 可以看做是模

  • Vue.js 2.5新特性介绍(推荐)

    TypeScript TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.2012年十月份,微软发布了首个公开版本的TypeScript,在2013年6月19日,微软发布了TypeScript 0.9的正式版本,到目前为止,TypeScript已发展到2.x版本 安装TypeScript 安装TypeScript主要有两种方式: 通过npm方式安装(Node.js包管理器) 安装TypeS

  • AngularJS 2.0新特性有哪些

    AngularJS已然成为Web应用开发世界里最受欢迎的开源JavaScript框架.自成立以来,见证其成功的是惊人的经济增长以及团体的支持与采用--包括个人开发者.企业.社区. Angular已经变成一个构建复杂单页面应用的客户端MVW框架(Model-View-Whatever).它在应用测试和应用编写方面都扮演重要角色,同时简化了开发过程. Angular目前的版本为1.3,该版本稳定,并被谷歌(框架维护者)用于支持众多应用(据估计,在谷歌有超过1600个应用运行于Angular1.2或1

  • Hibernate5新特性介绍

    在hibernate5中,有了一些新的变动: 新引导 API Spatial/GIS 支持 Java 8 支持 扩展 AUTO id 生成支持 命名策略分离 属性转换器支持 更好的 "bulk id table" 支持 事务管理 模式工具链 Session API类化 改进 OSGi 支持 改进 bytecode 增强功能 新的引导API 用来引导Hibernate(建立一个SessionFactory)的经典方式一直都是利用Configuration配置类.从

  • ES6中非常实用的新特性介绍

    ECMAScript 6离我们越来越近了,作为它最重要的方言,Javascript也即将迎来语法上的重大变革,InfoQ特开设"深入浅出ES6"专栏,来看一下ES6将给我们带来哪些新内容. 写在前面 ES6 已经提交给 Ecma 大会审查了,也就是说,我们将迎来一大波 javascript 的最新标准,还有一些语法糖.ES6 中有很多值得我们关注的东西,下面是我发现的一些我们最常用的一些新特性,进行记录一下. 1. for-of循环 这个东西用来循环数组很爽,原因呢,是因为它弥补了目前

  • Android Studio3.0新特性及安装图文教程

    Android Studio是Android的官方IDE.它是专为Android而打造,可以加快您的开发速度,帮助您为每款Android设备构建最优应用. 它提供专为Android开发者量身定制的工具,其中包括丰富的代码编辑.调试.测试和性能分析工具. 一.Android Studio3.0新特性 (1).核心IDE更改 我们将基础IDE从IntelliJ 2016.2升级到2017.1.2,在2016.3和 2017.1中增加了许多新功能, 包括参数提示,语义突出显示,搜索中的即时结果等等.

  • Angular5.0.0新特性

    文章来自官网部分翻译 https://blog.angular.io/version-5-0-0-of-angular-now-available-37e414935ced Angular5.0.0版本已经正式发布 总结一下v5.0.0带来的新变化都有哪些. 1.构建优化 5.0版本默认采用CLI构建和打包.构建优化器是包含在CLI里面的一个工具,通过对你的应用程序更加语义化的理解可以使得你的打包程序(bundle)更小. 构建优化器有两个主要工作. 第一,我们可以将应用程序的一部分标记为纯应用

  • 神经网络API、Kotlin支持,那些你必须知道的Android 8.1预览版和Android Studio 3.0新特性

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快. 过去的五个月里, Kotlin一直是我们反复谈论的重点.现在要告诉大家的是,Android Studio 3.0可以将Kotlin添加到您的项目中了.最新版本的Android Studio在支持Java 8语言功能上得到了改进,另外一个亮点是,有了用于Gradle 3.0.0的Android插件. 好,下面步入正文. 曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月

随机推荐