golang gorm更新日志执行SQL示例详解
作者:Jeff的技术栈 发布时间:2024-04-23 09:46:24
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) {
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的常见初始化(如HTTP
,URI
)是特殊处理的。
所以字段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(&re)
fmt.Println(re)
for _,k :=range re{
fmt.Println(k.Uid)
}
}
来源:https://www.cnblogs.com/guyouyin123/p/15770452.html
猜你喜欢
- 对于时间的选择问题,查到的大部分为两种情况:1.存在readonly属性的2.没有readonly属性的可直接赋值send_keys()测试
- asp使用WScript.Shell获取电脑的网络配置信息Option Explicit Dim WSHShe
- 1 新建类库MyTestDLL2 右击项目“MyTestDLL”-》属性-》生成-》勾选“为COM互操作注册”3 打开 AssemblyIn
- SQLSTATESQL SERVER 驱动程序错误描述 HY000所有绑定列都是只读的。必须是可升级的列,以使用 SQLSetPos 或 S
- 单下划线与双下划线在 python 中,会看到 _xx, xx 以及 __xx 这样的变量或者函数名,在这里做一个简要的总结。_xx:保护(
- pytorch 权重weight 与 梯度grad 可视化查看特定layer的权重以及相应的梯度信息打印模型观察到model下面有modul
- 异常(exceptions)是Python中一种非常重要的类型,它和语法错误不同,是在程序运行期间引发的错误。Python中内置了很多异常,
- 在使用python对网页进行多次快速爬取的时候,访问次数过于频繁,服务器不会考虑User-Agent的信息,会直接把你视为爬虫,从而过滤掉,
- 现在Django 3.0附带了对ASGI的支持,将Websockets添加到Django应用中不需要任何额外的依赖关系。 在本文中,您将学习
- 优秀的Stoyan Stefanov在他的新书中(《Javascript Patterns》)介绍了很多编写高质量代码的技巧,比如避免使用全
- 使用apidoc管理RESTful风格Flask项目接口文档方法apidoc项目地址flask扩展包地址文档示例地址1.安装nodejssu
- 下面是模板的一般形式,显示了指定 SQL 查询和 XPath 查询的方式: <ROOT xmlns:sql="ur
- 什么是Firebug从事了数年的Web开发工作,越来越觉得现在对WEB开发有了更高的要求。要写出漂亮的HTML代码;要编写精致的CSS样式表
- 本篇文章主要涉及mysql5.7.14用以往的安装方法安装存在的密码登录不上,密码失效等问题的解决办法,希望可以帮到有同样困扰的朋友。具体过
- property属性一种用起来像是使用实例属性一样的特殊属性,可以对应于某个方法既要保护类的封装特性,又要让开发者可以使用 对象.属性 的方
- 1-错误详情cmd下运行net start mysql启动MySQL服务:提示发生系统错误5。拒绝访问。cmd管理员模式运行可以启动MySQ
- 首先看这下面的例子(鼠标移上去):<TABLE><TBODY><TR&g
- 一、前言嗨,大家好,我是新发。有同学私信我让我写一篇Unity网格相关的教程,那我就带大家来一次Unity的网格探险之旅吧~二、Hello
- bs4解析原理:1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中2.通过调用BeautifulSoup对象中相
- 1. 区分读锁定 和 写 锁定。 如果每次都使用 写锁定,那么连多个进程读取一个文件也要排队,这样的效率肯定不行。 2. 区分 阻塞 与 非