gpt4 book ai didi

go - 如何使用 gorm 插件/钩子(Hook)将新记录插入数据库

转载 作者:行者123 更新时间:2023-12-03 10:07:53 28 4
gpt4 key购买 nike

在尝试使用 golang 中的 gorm 插入日志以检测模型的值更改时,我正在使用插件进行操作:

type MyModel struct {
Id
Name
}

type Log struct {
Id
NewValue
OldValue
CreatedAt
}
我的插件定义是这样的:
func ChangelogCreatePlugin(db *gorm.DB) {
log := &Log{NewValue: "the new value", OldValue: "the old value", CreatedAt: "current time"}
// Here is the problem
db.Save(log) <- this is not acceptable
}
使用 db *gorm.DB 插入不同的数据模型插件中的参数是 Not Acceptable ,因为该参数已初始化为接受来自触发插件的同一模型的数据。
我的要求是将我的日志存储在同一个数据库事务中,因此如果其中一个失败,它们都应该失败。如何在gorm中做这样的事情?
我知道钩子(Hook)。钩子(Hook)在我的情况下没有用,因为我希望我的日志跟踪不同的模型,所以我正在寻找更多“可重用”的解决方案,而不是在我的模型中复制/粘贴钩子(Hook)实现。

最佳答案

经过大量的挖掘和调试,我想出了这个解决方案:
您首先需要以正确的顺序注册您的插件执行,在我的情况下应该是这样的:

gormDb.Callback().Create().Before("gorm:commit_or_rollback_transaction").Register("changelog_create", ChangelogCreatePlugin)
此命令将保证您的插件将在模型的任何插入子句的事务提交之前被激活或触发。
要了解有关在哪里注册插件的更多信息,请查看 the default callbacks registered in gorm
这样做之后,我需要调整插件代码:
func ChangelogCreatePlugin(db *gorm.DB) {
// first make a check that the model insert transaction doesn't have any error
if db.Error != nil {
return
}


log := &Log{NewValue: "the new value", OldValue: "the old value", CreatedAt: "current time"}

// get a new db session for the new model to work
logDb := db.Session(&gorm.Session{})


// if an error ocurred while saving the log
// push it into original model db instance errors, so it will be rolledback eventually
logErr := logDb.Save(log)
if logErr != nil {
db.AddError(logErr)
}
}
希望有一天这可以帮助某人!

关于go - 如何使用 gorm 插件/钩子(Hook)将新记录插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64711515/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com