在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。我会的。