首页 > 数据库 >gorm实现MySQL的INSERT INTO ... ON DUPLICATE KEY UPDATE差异化插入和更新

gorm实现MySQL的INSERT INTO ... ON DUPLICATE KEY UPDATE差异化插入和更新

时间:2024-05-15 22:11:10浏览次数:15  
标签:INSERT ... dob 钩子 INTO db update create gorm

比如插入 f_create_uid,更新时忽略 f_create_uid,只更新 f_update_uid。可使用 gorm 的 BeforeCreate 和 BeforeUpdate 钩子,这两个钩子分别在创建和更新记录之前被调用。

// BeforeCreate 在创建记录之前调用
func (dob *MyStruct) BeforeCreate(tx *gorm.DB) (err error) {
    dob.CreateUid = // 设置创建人id
    dob.UpdateUid = // 设置更新人id
    return
}

// BeforeUpdate 在更新记录之前调用
func (dob *MyStruct) BeforeUpdate(tx *gorm.DB) (err error) {
    dob.UpdateUid = // 设置更新人id
    return
}

注册和应用钩子:

// 注册钩子
db.Callback().Create().Before("gorm:create").Register("before_create", func(db *gorm.DB) {
    if dob, ok := db.Statement.Dest.(MyStruct); ok {
        dob.BeforeCreate(db)
    }
})

db.Callback().Update().Before("gorm:update").Register("before_update", func(db *gorm.DB) {
    if dob, ok := db.Statement.Dest.(MyStruct); ok {
        dob.BeforeUpdate(db)
    }
})

// 批量插入或更新(在冲突时更新除主键以外的所有列到新值)
db := tx.Model(&MyStruct{})
db = db.Omit("f_id", "f_update_time", "f_create_time", "f_memo")
db = db.Clauses(clause.OnConflict{UpdateAll: true})
err := db.Create(me).Error
if err != nil {
    fmt.Printf("InsertOrUpdate error: %s", err.Error())
    return nil, err
}

取消注册的钩子:

// 取消注册 BeforeCreate 钩子
db.Callback().Create().Before("gorm:create").Unregister("before_create")

// 取消注册 BeforeUpdate 钩子
db.Callback().Update().Before("gorm:update").Unregister("before_update")

标签:INSERT,...,dob,钩子,INTO,db,update,create,gorm
From: https://www.cnblogs.com/aquester/p/18194787

相关文章

  • AI 一键生成高清短视频,视频 UP 主们卷起来...
    现在短视频越来越火,据统计,2023年全球短视频用户数量已达10亿,预计到2027年将突破24亿。对于产品展示和用户营销来说,短视频已经成为重要阵地,不管你喜不喜欢它,你都得面对它,学会使用它。但是,优质短视频的持续输出对视频创作者来说挑战还是很大的。选题策划、文案撰写、素材收集、......
  • openGauss 通过INSERT语句直接写入数据
    通过INSERT语句直接写入数据用户可以通过以下方式执行INSERT语句直接向openGauss数据库写入数据:使用openGauss数据库提供的客户端工具向openGauss数据库写入数据。请参见向表中插入数据。通过JDBC驱动连接数据库执行INSERT语句向openGauss数据库写入数据。详细内容请参见......
  • openGauss 相同表的并发INSERT
    相同表的并发INSERT事务T1:STARTTRANSACTION;INSERTINTOtestVALUES(2,'test2','test123');COMMIT;事务T2:STARTTRANSACTION;INSERTINTOtestVALUES(3,'test3','test123');COMMIT;场景1:开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,执......
  • openGauss 相同表的INSERT和DELETE并发
    相同表的INSERT和DELETE并发事务T1:STARTTRANSACTION;INSERTINTOtestVALUES(1,'test1','test123');COMMIT;事务T2:STARTTRANSACTION;DELETEtestWHERENAME='test1';COMMIT;场景1:开启事务T1,不提交的同时开启事务T2,事务T1执行INSERT完成后,执行事务T2的DELETE,此时显......
  • 【转】[IDEA] 启动报错 Internal error. Please refer to...
    转自:https://blog.csdn.net/liyh722/article/details/136699609 问题原因:java.net.BindException:地址已在使用中:也就是idea启动时需要占用一些端口,但是已经被其它打开的软件占用了。IDE正在本地主机上启动服务器,它将尝试在6942和6991之间的第一个可用端口上进行绑定,如果IDE......
  • Adding Drivers into VMWare ESXi Installation Image
    ThestandardESXiISOimagedoesn’tsupportmostdesktopNICadapters.ToinstallESXionsuchacomputer,youwillneedtoinjectthedriversforyournetworkadapterintoyourESXiinstallationimageLet’sseehowtoaddthedrivertotheVMwareESXi6.......
  • [转帖]Oracle23ai来了,23爱,23❤️,都安装好了...
    https://juejin.cn/post/7364059278242332710 专栏: Oracle日常运维宝典系列  makefile复制代码作者:IT邦德中国DBA联盟(ACDU)成员,10余年DBA工作经验擅长主流数据Oracle、MySQL、PG、openGauss运维备份恢复,安装迁移,性能优化、故障应急处理等可提供......
  • 关于VHDL中Loop State error...loop must terminate within 10,000 iterations错误解
    关于VHDL中LoopStateerror...loopmustterminatewithin10,000iterations错误解决方法首先比较下面两段代码:(使用while循环描述偶校验位产生电路)代码一:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;ent......
  • mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nona
    官方解释:ONLY_FULL_GROUP_BY是MySQL数据库提供的一个sql_mode,通过这个sql_mode来保证,SQL语句“分组求最值”合法性的检查.这种模式采用了与Oracle、DB2等数据库的处理方式。即不允许selecttargetlist中出现语义不明确的列.对于用到GROUPBY的select语句,查出......
  • Connecting to github.com (github.com)|20.205.243.166|:443... failed: Connection
    今天使用ubuntu虚拟机编译buidroot代码时出现一些压缩包无法从github下载,如下图: 可是拷贝上图log中的下载链接到windows浏览器进行打开会自动进行下载成功,如粘贴该链接 https://github.com/winshining/nginx-http-flv-module/archive/v1.2.8/nginx-http-flv-......