在mysql中插入带有gorm的类型化[]字节引发;错误1241:操作数应包含1列;
我有一个输入了在mysql中插入带有gorm的类型化[]字节引发;错误1241:操作数应包含1列;,mysql,go,go-gorm,Mysql,Go,Go Gorm,我有一个输入了[]字节(密码散列)的模型,我想使用gorm:v2将其保存在MySQL:5.7中 //这样就行了 类型ModelRaw结构{ 字节[]字节 } 类型哈希[]字节 //这行不通 类型模型类型结构{ 字节散列 } func main(){ //迁移数据库 //两个表都将有一个'bytes'列,其类型为'longblob default:NULL` 如果错误:=gormDB.AutoMigrate(&ModelRaw{},&ModelTyped{});错误!=nil{ 恐慌(错误) }
[]字节(密码散列)的模型,我想使用gorm:v2
将其保存在MySQL:5.7
中
//这样就行了
类型ModelRaw结构{
字节[]字节
}
类型哈希[]字节
//这行不通
类型模型类型结构{
字节散列
}
func main(){
//迁移数据库
//两个表都将有一个'bytes'列,其类型为'longblob default:NULL`
如果错误:=gormDB.AutoMigrate(&ModelRaw{},&ModelTyped{});错误!=nil{
恐慌(错误)
}
//这很有效
mdl1:=&ModelRaw{Bytes:[]字节(“随机字节”)}
如果错误:=gormDB.Debug().Create(mdl1).Error;err!=nil{
恐慌(错误)
}
//这里出错
mdl2:=&modeltypted{Bytes:Hash(“随机字节”)}
如果错误:=gormDB.Debug().Create(mdl2).Error;err!=nil{
恐慌(错误)
}
}
上述代码产生以下gorm
debug输出:
2020/11/06 10:31:29 /go/src/app/main.go:47
[7.715ms] [rows:1] INSERT INTO `model_raws` (`bytes`) VALUES ('random-bytes')
2020/11/06 10:31:29 /go/src/app/main.go:53 Error 1241: Operand should contain 1 column(s)
[0.926ms] [rows:0] INSERT INTO `model_typeds` (`bytes`) VALUES ((114,97,110,100,111,109,45,98,121,116,101,115))
panic: Error 1241: Operand should contain 1 column(s)
回购证明了问题:
它在gorm:v1
中工作,并在
gorm:v2中中断
gorm的AutoMigrate()将mysql表列创建为
longblobnull
使用的值必须是字节数组,而不是数字数组
人们会认为Bytes[]byte
等同于type Hash[]byte
加上Bytes Hash
,但显然不是这样
尝试一下:
mdl2 := &ModelTyped{Bytes: []byte(Hash("random-bytes"))}
或许
mdl2 := &ModelTyped{Bytes: []byte{Hash("random-bytes")}}
另一种可能性是在
散列
的定义中去掉结构
;这似乎造成了额外的“结构化”效果。要使其起作用,您应该只实现一个驱动程序。Valuer界面:
func (h Hash) Value() (driver.Value, error) {
return []byte(h), nil
}
然后,键入的数据将按预期使用Gorm v2。为什么不转换为字符串?GenerateFromPassword返回一个字节片,但这些字节都是可打印的字符。我可能有点反应过度,但我担心如果每次都必须将字节转换为字符串时会遇到麻烦。对于这一种情况,这是可以的,但是应用程序将来可能会有更多的
[]字节,并且在gorm:v1
中运行良好,因此我假设有更好的解决方案。如果没有任何帮助,我会这样做,ofc。我已经将我的密码哈希
类型实现为字符串
,并且它可以工作,但是下一个[]字节
将再次失败,这是不可接受的。您在mysql中使用的字节数组类型是什么?您可以始终为您的哈希类型实现扫描器
和赋值器
接口。示例:这将迫使我为任何仅用于gorm的类型为[]字节的字段的模型
创建单独的结构。如果什么都不起作用,那就随它去吧,但我不敢相信,它只是在gorm:v2
中停止工作,而在gorm:v1
中工作的完全相同的代码用gorm归档了一个bug?我越来越认为这是一个bug。我会的。