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
  • 更新只会更新更改的字段

大多数应用程序不会受到影响,只有当您更改回调中的更新值(如BeforeSaveBeforeUpdate)时,应该使用scope.SetColumn,例如:

func (user *User) BeforeUpdate(scope *gorm.Scope) {
  if pw, err := bcrypt.GenerateFromPassword(user.Password, 0); err == nil {
    scope.SetColumn("EncryptedPassword", pw)
    // user.EncryptedPassword = pw  // 不工作,更新时不会包括EncryptedPassword字段
  }
}

软删除的默认查询作用域只会检查deleted_at IS NULL

之前它会检查deleted_at小于0001-01-02也排除空白时间,如:

SELECT * FROM users WHERE deleted_at IS NULL OR deleted_at <= '0001-01-02'

但是没有必要,如果你使用*time.Time作为模型的DeletedAt,它已经被gorm.Model使用了,所以SQL就足够了

SELECT * FROM users WHERE deleted_at IS NULL

所以如果你使用gorm.Model,那么你是好的,没有什么需要改变,只要确保所有记录的空白时间为deleted_at设置为NULL,示例迁移脚本:

import (
    "github.com/jinzhu/now"
)
func main() {
  var models = []interface{}{&User{}, &Image{}}
  for _, model := range models {
    db.Unscoped().Model(model).Where("deleted_at < ?", now.MustParse("0001-01-02")).Update("deleted_at", gorm.Expr("NULL"))
  }
}
  • 新的ToDBName逻辑

在GORM将struct,Field的名称转换为db名称之前,只有那些来自golint的常见初始化(如HTTPURI)是特殊处理的。

所以字段HTTP的数据库名称将是http而不是h_t_t_p,但是一些其他的初始化,如SKU不在golint,它的数据库名称将是s_k_u,这看起来很丑陋,这个版本固定这个,任何大写的初始化应该正确转换。

错误RecordNotFound已重命名为ErrRecordNotFound

mssql驱动程序已从默认驱动程序中删除,

导入它用import _ "github.com/jinzhu/gorm/dialects/mssql"

Hstore已移至github.com/jinzhu/gorm/dialects/postgres

gorm执行sql

type Object interface {
  GroupOrderOpenlog() (uidList []int)
}
func (o *object) GroupOrderOpenlog() {
	type res struct {
		Uid int `json:"uid"`
	}
	var re []res
	sql:= "SELECT uid FROM order_openlog  GROUP BY uid"
	o.Db.Raw(sql).Scan(&amp;re)
	fmt.Println(re)
	for _,k :=range re{
		fmt.Println(k.Uid)
	}
}

以上就是golang gorm更新日志执行SQL示例详解的详细内容,更多关于golang gorm更新日志执行SQL的资料请关注我们其它相关文章!

(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. 属于 1.2. 包含一个 1.3. 包含多个 1.4. 多对多 1.5. 多种包含 1.6. 关联模式 1. 关联 1.1. 属于 // `User`属于`Profile`, `ProfileID`为外键 type User struct { gorm.Model Profile Profile ProfileID int } type Profile struct { gorm.Model Name string } db.Model(&user).Related(

  • 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实现get请求查询案例测试

    目录 案例 查询班级get请求 查询学生get请求 案例 package main import ( _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" "github.com/gin-gonic/gin" ) //班级-学生:一对多 type Class struct { gorm.Model ClassName string Students []Student //班级有多

  • golang gorm开发架构及写插件示例

    目录 1. 开发 1.1. 架构 1.2. 写插件 1.2.1. 注册新的callback 1.2.2. 删除现有的callback 1.2.3. 替换现有的callback 1.2.4. 注册callback顺序 1.2.5. 预定义回调 1. 开发 1.1. 架构 Gorm使用可链接的API,*gorm.DB是链的桥梁,对于每个链API,它将创建一个新的关系. db, err := gorm.Open("postgres", "user=gorm dbname=gorm

  • golang gorm的预加载及软删硬删的数据操作示例

    目录 1. orm读写数据 1. 创建 1.1. 创建记录 1.2. 默认值 1.3. 在Callbacks中设置主键 1.4. 扩展创建选项 2. 查询 2.1. Where查询条件 (简单SQL) 2.2. Where查询条件 (Struct & Map) 2.3. Not条件查询 2.4. 带内联条件的查询 2.5. Or条件查询 2.6. 查询链 2.7. 扩展查询选项 2.8. FirstOrInit 2.9. Attrs 2.10. Assign 2.11. FirstOrCreat

  • 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) {

  • Golang 实现 RTP音视频传输示例详解

    目录 引言 RTP 数据包头部字段 Golang 的相关实现 结尾 引言 在 Coding 之前我们先来简单介绍一下 RTP(Real-time Transport Protocol), 正如它的名字所说,用于互联网的实时传输协议,通过 IP 网络传输音频和视频的网络协议. 由音视频传输工作小组开发,1996 年首次发布,并提出了以下使用设想. 简单的多播音频会议 使用 IP 的多播服务进行语音通信.通过某种分配机制,获取多播组地址和端口对.一个端口用于音频数据的,另一个用于控制(RTCP)包,

  • Golang WorkerPool线程池并发模式示例详解

    目录 正文 处理CVS文件记录 获取测试数据 线程池耗时差异 正文 Worker Pools 线程池是一种并发模式.该模式中维护了固定数量的多个工作器,这些工作器等待着管理者分配可并发执行的任务.该模式避免了短时间任务创建和销毁线程的代价. 在 golang 中,我们使用 goroutine 和 channel 来构建这种模式.工作器 worker 由一个 goroutine 定义,该 goroutine 通过 channel 获取数据. 处理CVS文件记录 接下来让我们通过一个例子,来进一步理

  • vue实现前端展示后端实时日志带颜色示例详解

    目录 vue实现前端展示后端带颜色的日志 需求 操作 采用innerHTML例子 需求: 解决 效果 vue实现前端展示后端带颜色的日志 需求 通过loki获取项目产生的日志,并且在前端显示出来,一开始在没有经过处理的数据会显示一些乱码,并没有将字符转换 经过一番查询后,发现可以使用ansi_up来对日志进行操作颜色代码进行转化. 操作 ansi_up 能够装换颜色代码 GitHub地址 https://github.com/drudru/ansi_up 安装 npm install ansi_

  • Golang中的错误处理的示例详解

    目录 1.panic 2.包装错误 3.错误类型判断 4.错误值判断 1.panic 当我们执行panic的时候会结束下面的流程: package main import "fmt" func main() { fmt.Println("hello") panic("stop") fmt.Println("world") } 输出: go run 9.go hellopanic: stop 但是panic也是可以捕获的,我们可

  • Golang实现简单http服务器的示例详解

    目录 一.基本描述 二 .具体方法 2.1 连接的建立 2.2 http请求解析 2.3 http请求处理 2.4 http请求响应 三.完整示例 一.基本描述 完成一个http请求的处理和响应,主要有以下几个步骤: 监听端口 建立连接 解析http请求 处理请求 返回http响应 完成上面几个步骤,便能够实现一个简单的http服务器,完成对基本的http请求的处理 二 .具体方法 2.1 连接的建立 go中net包下有提供Listen和Accept两个方法,可以完成连接的建立,可以简单看下示例

  • Golang 官方依赖注入工具wire示例详解

    目录 依赖注入是什么 开源选型 wire providers injectors 类型区分 总结 依赖注入是什么 Dependency Injection is the idea that your components (usually structs in go) should receive their dependencies when being created. 在 Golang 中,构造一个结构体常见的有两种方式: 在结构体初始化过程中,构建它的依赖: 将依赖作为构造器入参,传入进

  • Golang控制协程执行顺序方法详解

    目录 循环控制 通道控制 互斥锁 async.Mutex 在 Go 里面的协程执行实际上默认是没有严格的先后顺序的.由于 Go 语言 GPM 模型的设计理念,真正执行实际工作的实际上是 GPM 中的 M(machine) 执行器,而我们的协程任务 G(goroutine) 协程需要被 P(produce) 关联到某个 M 上才能被执行.而每一个 P 都有一个私有队列,除此之外所有的 P 还共用一个公共队列.因此当我们创建了一个协程之后,并不是立即执行,而是进入队列等待被分配,且不同队列之间没有顺

  • Golang实现数据结构Stack(堆栈)的示例详解

    目录 前言 介绍Stack Stack Push Pop Peek Len & Cap & Clear NewStack 使用 前言 始于此篇,为了学习 Golang 基础,采用了使用 Golang 实现各种数据结构,以此来和 Golang 交朋友,今天的主题就是 把Stack介绍给Golang认识 源码:Stack 介绍Stack 在计算机科学中,stack(栈)是一种基本的数据结构,它是一种线性结构,具有后进先出(Last In First Out)的特点. 上述是通过对 ChatGP

  • Golang设计模式工厂模式实战写法示例详解

    目录 拆出主板 工厂模式流程 代码实战 抽象能力,定义接口 实现工厂,支持注册和获取实现 主流程只依赖接口完成 扩展 => 适配器,实现接口 注册适配器到工厂里 小结 拆出主板 今天带大家看一下怎么用 Go 写工厂模式的代码,我们来学习一个实战案例.这个写法笔者日常经常使用,能够很有效地帮助大家实现 Separation of Concerns. 主板就是一个程序的主流程.比如我们要基于一份学习资料来消化,吸收知识.我们可能有下面几步流程: 准备好笔记本: 打开资料: 阅读资料内容,思考并记录关

随机推荐