Postgresql go gorm postgres方言:管理jsonb插入和查找的结构以正确使用json标记
我已经做了大量的搜索,虽然我可以找到一堆好文章来解释如何直接使用pq包。我无法在go gorm和postgresql方言的环境中工作 如果在checks.go中,我使用ChecksMap,它不允许我插入,但允许我查找。如果我使用postgres.jsonb,它允许我插入和查询,但是找到的记录将是jsonb Gorm使用指针的结构来确定db表和模式。当使用从API返回json响应的通用searchHandler实用程序时,这会引起麻烦。对于任何非jsonb类型,gorm都使用适当的结构并使用json标记,但是对于jsonb,由于它没有对jsonb的“结构”的引用,所以不能使用json标记。这导致返回的API json具有大写键Postgresql go gorm postgres方言:管理jsonb插入和查找的结构以正确使用json标记,postgresql,go,go-gorm,Postgresql,Go,Go Gorm,我已经做了大量的搜索,虽然我可以找到一堆好文章来解释如何直接使用pq包。我无法在go gorm和postgresql方言的环境中工作 如果在checks.go中,我使用ChecksMap,它不允许我插入,但允许我查找。如果我使用postgres.jsonb,它允许我插入和查询,但是找到的记录将是jsonb Gorm使用指针的结构来确定db表和模式。当使用从API返回json响应的通用searchHandler实用程序时,这会引起麻烦。对于任何非jsonb类型,gorm都使用适当的结构并使用jso
{
results: {
id: "123",
someId: "456",
results: [
{
Description: "foobar"
}
]
}
}
是否有一种优雅的方式来处理这类事情,以便jsonb结果列具有正确的结构并使用小写的json标记?我只是想做一些在go gorm的背景下不应该做的事情吗
POSTGRESQL DDL
创建表检查(
id文本,
一些id文本,
结果jsonb
);
检查。开始
类型CheckRules结构{
Description字符串`json:“Description”`
}
键入ChecksMap映射[string]CheckRules
类型检查结构{
ID字符串`gorm:“主键”,json:“ID”`
SomeID*string`json:“SomeID”`
Results postgres.jsonb`json:“Results”`/您可以使用自定义的ChecksMap
类型,但在其值接收器上实现driver.Valuer
接口,而不是指针接收器
因此,不是:
func (cm *ChecksMap) Value() (driver.Value, error) { ...
你可以这样写:
func (cm ChecksMap) Value() (driver.Value, error) {
if cm == nil {
return nil, nil
}
return json.Marshal(cm)
}
或者,您也可以使用指针实现,但必须将字段转换为指针,例如:
type Checks struct {
ID string `gorm: "primary_key", json:"id"`
SomeID *string `json:"someId"`
Results *ChecksMap `json:"results"`
}
(虽然我还没有测试过,所以我不能100%确定gorm将如何处理这种情况)尝试在值接收器上实现driver.Valuer
接口,而不是指针。也就是说,将func(cm*ChecksMap)value()…
更改为func(cm ChecksMap)value()如果您这样做,…
,insert仍然会失败吗?如果仍然失败,您能说明错误是什么吗?如果没有错误,您能说明如何实现值()
method?@mkopriva成功了。你真是天赐良机,我开始自我反省,包括问一些愚蠢的问题,这些问题的答案都很愚蠢或拼写错误。学习围棋是一项挑战,只是在gorm文档中找到了一些关于这方面的提示信息……但没有详细说明。如果你写一个关于实现围棋的简短回答river.valuer,尽管我的代码不正确,但我觉得这是一个适合这个问题的答案。然后我就可以投票了。不过你的电话。再次感谢。