首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何防止gorm忽略.Updates()子句中`UpdatedAt`字段的值?

在使用GORM(Go语言的ORM库)进行数据库操作时,UpdatedAt字段通常会被自动更新为当前时间戳。如果你希望在调用Updates()方法时保留UpdatedAt字段的原有值,可以采取以下几种方法:

方法一:使用Select和Omit

你可以使用Select方法指定要更新的字段,或者使用Omit方法排除不需要更新的字段。例如:

代码语言:txt
复制
// 使用Select指定要更新的字段
db.Model(&user).Select("Field1", "Field2").Updates(map[string]interface{}{"Field1": value1, "Field2": value2})

// 使用Omit排除不需要更新的字段
db.Model(&user).Omit("UpdatedAt").Updates(map[string]interface{}{"Field1": value1, "Field2": value2})

方法二:手动设置UpdatedAt字段

在调用Updates()方法之前,你可以手动设置UpdatedAt字段的值。例如:

代码语言:txt
复制
// 手动设置UpdatedAt字段的值
user.UpdatedAt = time.Now().Add(-1 * time.Hour) // 设置为当前时间一小时前的值
db.Save(&user)

方法三:禁用自动更新UpdatedAt字段

如果你希望完全禁用UpdatedAt字段的自动更新,可以在定义模型时设置gorm:"autoUpdateTime"标签。例如:

代码语言:txt
复制
type User struct {
    ID        uint `gorm:"primaryKey"`
    Field1    string
    Field2    string
    UpdatedAt time.Time `gorm:"autoUpdateTime:false"`
}

应用场景

  • 批量更新:当你需要批量更新多个记录时,可能会希望保留某些字段的原有值,以避免不必要的副作用。
  • 特定业务逻辑:在某些业务场景下,可能需要手动控制时间戳的更新,以满足特定的业务需求。

参考链接

通过以上方法,你可以有效地防止GORM在调用Updates()方法时忽略UpdatedAt字段的值。选择哪种方法取决于你的具体需求和应用场景。

相关搜索:如何忽略`if`语句中`or`的False值如何防止ActiveRecord Where子句中字段和值都是动态注入如何在where子句中创建子查询以获取最大字段值如何防止输入字段接受大于最大值的值如何防止在switch语句中多次选择相同的选项/值如何在MySQL的group by子句中检索max date字段基值?如何在子查询的WHERE子句中使用UNNEST中的多个值?如何将子查询中的字段/列添加到外部select语句中?如何更新特定输入字段的值,而不是td第一个子字段的值?如果文本字段没有可以忽略该方法的值,我如何创建if语句?如何仅序列化变量的名称并忽略struct (serde)中枚举字段的值如何防止用户在选择器字段中为不在选择器列表中的值输入值[Acumatica]C# -如何将值设置为通过set函数获取的字段的子级如何映射字段名称中既有点又有值子元素的json响应如何根据Rails和Mongodb中的字段值将对象数组拆分为子数组如何根据子查询的结果更改其中一个字段,错误:子查询返回1个以上的值?如何搜索对象(或其子对象)是否包含给定名称的字段并验证其值当在同一页面上使用多个组件实例时,如何防止子组件类变量的值被覆盖?如何仅在设置了值的情况下才显示ACF子字段,如果未设置,则隐藏?如何使用应用程序中存在的字段值,并使用自定义对象将其设置为子窗体中存在的字段。在RSA Archer中?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

gorm 教程 一

`addr`索引 IgnoreMe int `gorm:"-"` //忽略这个字段}惯例我们要记住惯例大于配置,gorm.Modelgorm.Model 是一个包含一些基本字段结构体...会排除那些没有或者有 零 字段,在记录插入数据库之后,gorm将从数据库中加载这些字段。...`gorm:"default:18"`}在钩子中设置字段如果你想在 BeforeCreate 函数中更新字段,应该使用 scope.SetColumn,例如:func (user *User)...,GORM 将会查询这些字段非零, 意味着你字段包含 0, '', false 或者其他 零, 将不会出现在查询语句中, 例如:db.Where(&User{Name: "jinzhu", Age...", 0, false 是这些字段类型db.Model(&user).Updates(User{Name: "", Age: 0, Actived: false})更新选中字段如果你在执行更新操作时只想更新或者忽略某些字段

28200

Gorm 数据库表迁移与表模型定义

, "jinzhu").Delete(&User{}) // DELETE FROM deleted_users WHERE name = 'jinzhu'; 查看 from 查询 了解如何在 FROM...子句中使用查询 4.2.3 命名策略 GORM 允许用户通过覆盖默认命名策略更改默认命名约定,命名策略被用于构建: TableName、ColumnName、JoinTableName、RelationshipFKName...UpdatedAt 对于有 UpdatedAt 字段模型,更新记录时,将该字段设为当前时间。...创建记录时,如果该字段为零,则将该字段设为当前时间 db.Save(&user) // 将 `UpdatedAt` 设为当前时间 db.Model(&user).Update("name",...这样您就可以让一个字段权限是只读、只写、只创建、只更新或者被忽略 注意: 使用 GORM Migrator 创建表时,不会创建被忽略字段 type User struct { Name string

36310
  • Gorm框架学习--入门

    Price", 200) // Update - 更新多个字段 db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零字段...默认情况下,GORM 使用 ID 作为主键,使用结构体名 蛇形复数 作为表名,字段 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间 遵循 GORM 已有的约定...---- gorm.Model GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt // gorm.Model 定义 type...这样您就可以让一个字段权限是只读、只写、只创建、只更新或者被忽略 注意: 使用 GORM Migrator 创建表时,不会创建被忽略字段 type User struct { Name string...int 即可 type User struct { CreatedAt time.Time // 在创建时,如果该字段为零,则使用当前时间填充 UpdatedAt int //

    2.1K10

    Go gorm

    自动管理) UpdatedAt time.Time // 最后一次更新时间(由GORM自动管理) }约定主键:GORM 使用一个名为ID 字段作为每个模型默认主键。...列名:GORM 自动将结构体字段名称转换为 snake_case 作为数据库中列名。时间戳字段GORM使用字段 CreatedAt 和 UpdatedAt 来自动跟踪记录创建和更新时间。...`,`age`,`created_at`) VALUES ("jinzhu", 18创建记录并忽略传递给 ‘Omit’ 字段db.Omit("Name", "Age", "CreatedAt").Create...当使用 struct 更新时,默认情况下GORM 只会更新非零字段// 根据 `struct` 更新属性,只会更新非零字段db.Model(&user).Updates(User{Name: "...SET name='new_name', age=0 WHERE id=111;// 选择所有字段(选择包括零字段所有字段)db.Model(&user).Select("*").Updates(

    11110

    GORM V2 模型定义、约定、标签

    time.Time } 03 约定 GORM 已有约定 默认情况下,GORM 约定使用 ID 作为主键,使用结构体名复数作为表名,字段名作为列名,使用 CreatedAt、UpdatedAt...gorm.Model GORM 定义了一个 gorm.Model 结构体,字段包括 ID、CreatedAt、UpdatedAt、DeletedAt,我们可以将它嵌入到我们自定义结构体中,详情见 04...、只创建、只更新和忽略字段。...比如时间追踪默认是将为零创建时间CreatedAt 字段以当前时间填充,以当前时间戳秒数填充 UpdatedAt 字段,如果您想要保存 UNIX(毫/纳)秒时间戳,而不是 time,您只需简单地将...示例代码: type User struct { CreatedAt time.Time // 在创建时,如果该字段为零,则使用当前时间填充 UpdatedAt int //

    3.7K20

    上次问题解决啦,重新送上Go ORM 单元测试全流程讲解

    Mock时候没办法精致匹配这个字段,这个问题也就作为一个未解决问题在文章中发布了出去。...这种情况可以选择在 Mock 要执行更新 SQL 时给 updated_at字段设置成sqlmock.AnyArg(),就能测试通过了,上面的 UPDATE 测试改成下面这样: mock.ExpectBegin...WillReturnResult(sqlmock.NewResult(1, 1)) mock.ExpectCommit() 这个方法是sqlmock提供用来断言匹配任意字段一个特殊类型。...,以及严谨性上都会差点意思,因为如果真实执行 SQL 中如果updated_at字段设置不是time.Time类型,使用sqlmock.AnyArg()做断言匹配是无法测出来。...(time.Time) return ok } 在 AnyTime 类型实现接口定义Match方法逻辑是:判断字段只要是time.Time 类型,就能验证通过。

    87640

    Go结构体标签

    标签选项:标签选项使用说明-字段不进行序列化 例:json:"-"omitempy类型零或空,序列化时忽略字段 例:json:",omitempy" 字段名省略的话用结构体字段名Type重新指定字段类型...默认情况下,GORM 使用 ID 作为主键,使用结构体名 蛇形复数 作为表名,字段 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间。...GORM 默认定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt,可以嵌套入自建结构体,tag名大小写不敏感,建议使用camelCase...Migrator 创建表时,不会创建被忽略字段。...无写入权限、设置字段权限,->:false 无读权限-忽略字段,- 无读写权限comment迁移时为字段添加注释关联标签GORM 允许通过标签为关联配置外键、约束、many2many

    1.2K31

    Gorm实战,轻松掌握数据库增删改查技巧!

    Gorm实战,轻松掌握数据库增删改查技巧! CRUD通常指数据库增删改查操作,本文详细介绍了如何使用GORM实现创建、查询、更新和删除操作。...Age int64 `gorm:"default:18"` } 插入记录到数据库时,默认 会被用于 填充值为 零 字段 注意 对于声明了默认字段,像 0、''、false 等零是不会保存到数据库...当使用 struct 更新时,默认情况下,GORM 只会更新非零字段 //根据 `struct` 更新属性,只会更新非零字段 db.First(&student) db.Model(&student...GORM 提供了 Changed 方法,它可以被用在 Before Update Hook 里,它会返回字段是否有变更布尔 Changed 方法只能与 Update、Updates 方法一起使用,并且它只是检查...Model 对象字段与 Update、Updates 是否相等,如果有变更,且字段没有被忽略,则返回 true func (u *Student) BeforeUpdate(tx *gorm.DB

    3.3K20

    day5 | 设计模式之 DatabaseSQL 与 GORM 实践 | 第三届字节跳动青训营笔记

    、一对多、单表自关联、多态;Preload、 Joins 预加载、级联删除;关联模式;自定义关联表 事务:事务代码块、嵌套事务、Save Point 多数据库、读写分离、命名参数、Map、查询、分组条件..._ cases复数格式 字段名为field namesnake_ case单数格式 ID/ ld字段为主键,如果为数字,则为自增主键 CreatedAt字段,创建时,保存当前时间 UpdatedAt字段...sql.NullInt64 `gorm:"column:user_age"` // 零类型 Birthday *time.Time Email string...`gorm:"type:varchar(120);unique_index"` Role string `gorm:"size:255"` // 设置字段大小为255...addr索引 IgnoreMe int `gorm:"-"` // 忽略字段 } // 使用`AnimalID`作为主键 type Animal struct

    1.5K20

    day5 | 设计模式之DatabaseSQL与GORM实践 | 第三届字节跳动青训营笔记

    、一对多、单表自关联、多态;Preload、 Joins 预加载、级联删除;关联模式;自定义关联表 事务:事务代码块、嵌套事务、Save Point 多数据库、读写分离、命名参数、Map、查询、分组条件..._ cases复数格式 字段名为field namesnake_ case单数格式 ID/ ld字段为主键,如果为数字,则为自增主键 CreatedAt字段,创建时,保存当前时间 UpdatedAt字段...sql.NullInt64 `gorm:"column:user_age"` // 零类型 Birthday *time.Time Email string...`gorm:"type:varchar(120);unique_index"` Role string `gorm:"size:255"` // 设置字段大小为255...addr索引 IgnoreMe int `gorm:"-"` // 忽略字段 } // 使用`AnimalID`作为主键 type Animal struct

    81120

    Go语言ORM-gorm学习笔记(一)

    ID,CreatedAt,UpdatedAt,DeletedAt四个字段go结构体 Name string `gorm:"column:username;comment:'用户名'"` // 使用...tag标记 column 定义字段名称 使用tag标记 comment 定义字段注释 Age sql.NullInt64 `gorm:"comment:'年龄'"` Birthday *time.Time...:"-"` // 使用tag标记 - 忽略字段 } 结构体标记(tags) 标记(tags)在声明模型时是可选项。...将列指定为唯一 DEFAULT 指定列默认 PRECISION 指定列精度 NOT NULL 将列指定为非NULL AUTO_INCREMENT 指定列是否为自增类型 INDEX 创建具有或不带名称索引...,如果多个索引同名则创建复合索引 UNIQUE_INDEX 和INDEX类似,只不过创建是唯一索引 EMBEDDED 将结构设置为嵌入 EMBEDDED_PREFIX 设置嵌入结构前缀 - 忽略字段

    1.6K40

    一文学会 Go 三个主流开发框架| 青训营笔记

    仅更新非零字段 db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"}) // Delete...GORM 也采用了这种设计范例,这意味着: 默认情况下,GORM 使用 ID 作为主键,使用结构体名 蛇形复数 作为表名,字段 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建..., "D42") // 查找 code 字段为 D42 记录 对应增删改查中“查”。...,当使用结构体作为查询条件时,只会查询结构体内非零字段,这意味着字段为 0, '', false 或其他零字段不会被用于构建查询条件。...db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零字段 db.Model(&product).Updates

    2.7K10

    Go开源ORM——GORM

    依赖安装 github.com/jinzhu/gorm 定义实体类 注意: 实体类结构体中,要映射到数据库字段首字母必须大写,否则会被忽略 可以通过定义嵌套gorm.Model这个结构体类型来定义实体类...UpdatedAt time.Time DeletedAt *time.Time } 比如我们定义User实体 type User struct{ gorm.Model Name...方法提供对记录进行更新操作,可以通过Map或者struct传递更新属性,建议通过Map 因为通过struct更新时,FORM将仅更新具有非空字段 // 使用`map`更新多个属性,只会更新这些更改字段...= '2013-11-17 21:34:10' WHERE id = 111; // 对于下面的更新,什么都不会更新为"",0,false是其类型空白 db.Model(&user).Updates..., lastWeek, today).Find(&users) Where进行Struct或者Map查询 建议使用Map查询,因为当使用struct查询时,GORM将只查询那些具有字段 // Struct

    2.1K41

    Gorm 实践指南

    (只读/写/更新/创建/忽略GORM v2 版本中,加入了对字段支持, 用来避免对一些数据进行误操作,权限级别一共分为:忽略, 只读,只更新,只创建 等: type User struct...{Name: "jinzhu", Role: "admin", Age: 0}) // Select 除 Role 外所有字段(包括零字段所有字段) db.Model(&user).Select...它可以被用在 Before Update Hook 里,它会返回字段是否有变更布尔 Changed 方法只能与 Update、Updates 方法一起使用,并且它只是检查 Model 对象字段与...Update、Updates 是否相等,如果有变更,且字段没有被忽略,则返回 true func (u *User) BeforeUpdate(tx *gorm.DB) (err error)...在更新数据时,如果使用了 struct 来更新数据,默认只会更新非零字段,如果使用map更新数据,则会更新全部字段,在使用 struct 更新时,也可以使用 Select 方法来选择想要更新字段

    2.2K20
    领券