gorm调用beforeUpdate等钩子函数时报错 reflect.Value.Addr of unaddressable value

news/2025/3/23 4:47:09/

问题说明

使用下面的结构体在执行gorm的Save、update、updates方法时,会自动调用钩子函数BeforeUpdate,官方文档中的示例也是这么写的。但是出现报错reflect.Value.Addr of unaddressable value

type ArtworkLockRecord struct {//some fields
}
func (a *ArtworkLockRecord) BeforeUpdate(tx *gorm.DB) (err error) {return nil
}

随后,调试过程中,发现func (a *ArtworkLockRecord) BeforeUpdate中的星号去掉,就不报错了。

type ArtworkLockRecord struct {//some fields
}
func (a ArtworkLockRecord) BeforeUpdate(tx *gorm.DB) (err error) {return nil
}

但是BeforeUpdate拿到的结构体数据是的,另外还有一个神奇的现象,BeforeUpdate执行了好多次。

解决方案

问题实际在调用方法上,问题代码如下

err = db.DB.Debug().Model(model.ArtworkLockRecord{}).Where("id = ?", findArtwork.ID).Save(&findArtwork).Error

这里有两个问题:

  1. 使用Model方法后,gorm会去调用它传入的结构体钩子函数。而不是SaveUpdateUpdatesCreate等等方法中传入的结构体。上面的方法中,Model中传入的结构体没有携带数据,所以执行钩子函数时,会拿不到任何数据。
  2. Model方法中传入的参数应该是结构体指针,这里却传入了结构体对象,在调用钩子函数时,会报错可不寻址。

总结

有些开源项目中,Model方法传入结构体指针(Model(model.ArtworkLockRecord{}))这种写法从实际情况来看是不可取的。
此外,调用Save方法时,没必要再加一个Model


http://www.ppmy.cn/news/114614.html

相关文章

16JS07——数组

目标: 1、数组的概念 2、创建数组 3、获取数组中的元素 4、遍历数组 5、数组中新增元素 6、数组案例 一、数组的概念 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变…

【03.04】大数据教程--html+css基础

当谈到大数据时,HTML和CSS可能并不是最相关的技术。HTML和CSS主要用于构建网页和应用程序的用户界面,而大数据则涉及处理和分析大规模数据集。但是,如果您想展示有关大数据的信息或结果,并在网页上呈现,那么HTML和CSS可…

Fatal error: Port 9100 is already in use by another process.

解决办法 #查看占用端口的进程id lsof -i:9100 #杀死进行 kill -9 4852

i310100和i39100f对比哪个好 i3 10100和i3 9100f差别大吗

i3-10100基于祖传的14nm制程工艺,拥有4核8线程,默认主频3.6Ghz,最大睿频4.3Ghz,三级缓存为6MB,不支持超频,内置UHD630核显,设计功耗65W 选i3 10100还是i39100f这些点很重要!看完你就知道了 http…

实施AS9100标准的意义

1、市场范围不断扩大 您的认证可为您打开未利用的国内和国际商业的商机之门。另外,AS-认证的质量系统有助于建立商业之间的共同语和期望水平。通过让公司具有一样的标准,可实现提高效率的目的,否则便不能达到此目的或通过个人/所有者的质量系…

关于解决prometheus报错get “http://ip:9100/metrics“:connect:no route to host

linux服务器部署node_exporter完成后 启动node_exporter服务,一切正常,日志也未报错,访问地址:http://ip:9100,就是访问不了 如图 访问Prometheus平台 http://ip:9090,state显示down 其他两台服务器一样的配置均正常…

elk日志分析部署报错,出现9100端口,9200端口不见

在主机上刚开始安装了elasticsearch的时候启动9200端口成功 当安装完 node-v8.2.1.tar.gz和elasticsearch-head.tar.gz之后,对服务再次就行启动时发现 9100端口可以正常启动,而9200端口启动不了, systemctl start elasticsearch时没有任何报…

Windows查看9100端口号被占用情况

1.输入命令:netstat -ano | findstr "9100" 效果: TCP 0.0.0.0:9100 0.0.0.0:0 LISTENING 7712TCP [::]:9100 [::]:0 LISTENING 77122.右击任务栏打开任务管理器找到P…