Closed noahlann closed 2 years ago
补充:
这个问题应该不是不支持 gorm-gen
,而是不支持批量插入。
希望能修改ModifyStatement (create) 内部的反射功能。
实际上将此方法修改为
func (v VersionCreateClause) ModifyStatement(stmt *gorm.Statement) {
var reflectValue reflect.Value
switch stmt.ReflectValue.Kind() {
case reflect.Slice, reflect.Array:
rv := stmt.ReflectValue.Index(stmt.CurDestIndex)
reflectValue = reflect.Indirect(rv)
default:
reflectValue = stmt.ReflectValue
}
var value int64 = 1
if val, zero := v.Field.ValueOf(stmt.Context, reflectValue); !zero {
if version, ok := val.(Version); ok {
value = version.Int64
}
}
stmt.SetColumn(v.Field.DBName, value)
}
即可解决当前问题,但不清楚是否有其它情况发生。
另 VersionUpdateClause
的此方法暂时还没有修改方案。
最近有点忙,期待你的pr
最近有点忙,期待你的pr
暂时没想好 Update
的修改方案, struct to map 的意图也还没搞清楚。。。待会儿先将Create的修改pr上去吧,后期等官方修复。
@crazy6995 原来你在看啊,Slice/Array
需要支持每一项单独设置,使用v.Field.Set 代替 stmt.SetColumn
。
看你的意思update也有问题,我把 https://github.com/go-gorm/optimisticlock/pull/10 关了,都交给你了。
暂时没想好
Update
的修改方案, struct to map 的意图也还没搞清楚。。。待会儿先将Create的修改pr上去吧,后期等官方修复。
struct to map是因为version是int型,而期望值version+1
是string,struct无法赋值
@a631807682 我反复测试了一下,update其实并没有类似create的批量api,所以其实是没有问题的。
另外我看了一下你的实现,已经完美解决了问题,就是 setVersionColumn
方法名有点问题。
要不你reopen #10 或者我重新弄个pr也行。
在使用gorm-gen时,出现panic
生成语句:
生成的模型:
执行操作:
出现错误:
看情况应该是
version.go
中这个方法的异常,大概是通过反射寻找非零值的Version
摸一摸具体原因可能是:
因为gorm-gen的 Create 方法是传递的可变参数,
stmt.ReflectValue
的 Kind是23(slice)而非25(struct)出现的错误。由此可得,修改修改
ModifyStatement
应该就好了。