Postgresql go gorm postgres方言:管理jsonb插入和查找的结构以正确使用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

我已经做了大量的搜索,虽然我可以找到一堆好文章来解释如何直接使用pq包。我无法在go gorm和postgresql方言的环境中工作

如果在checks.go中,我使用ChecksMap,它不允许我插入,但允许我查找。如果我使用postgres.jsonb,它允许我插入和查询,但是找到的记录将是jsonb

Gorm使用指针的结构来确定db表和模式。当使用从API返回json响应的通用searchHandler实用程序时,这会引起麻烦。对于任何非jsonb类型,gorm都使用适当的结构并使用json标记,但是对于jsonb,由于它没有对jsonb的“结构”的引用,所以不能使用json标记。这导致返回的API json具有大写键

{
   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,尽管我的代码不正确,但我觉得这是一个适合这个问题的答案。然后我就可以投票了。不过你的电话。再次感谢。