如何为Play-Scala Anorm PostgreSQL设置JSONB[]类型

3

我正在使用Scala/Play框架构建调查应用程序,并使用Postgres9.4和Anorm。我在其他地方使用JSONB作为数据类型,但在一个位置上,我想使用JSONB[],认为这种类型是JSONB值的数组。我的JSON结构如下:

[
    {"guitar":{"passion":3,
               "expertise":5,
               "willingToTeach":false,
               "lookingForOthers":false
              }
     },
     {"soccer":{"passion":3,
                "expertise":3,
                "willingToTeach":true,
                "lookingForOthers":true
                }
     }
]

这里每个兴趣都是一个json结构。我已经能够使用jsonb作为数据类型将json响应值添加到pgsql的其他列中,但当我尝试使用jsonb[]时,就会出现错误信息:[PSQLException: Unknown type jsonb[].] 在pgadmin3中,它确实显示了我正在尝试插入的列的确切数据类型:jsonb[]。在我的anorm插入代码中,我尝试设置类型:

val pgObject = new PGobject();
pgObject.setType("jsonb")

但是我收到了这个错误:

[PSQLException: ERROR: column "passions" is of type jsonb[] but expression is of type jsonb
  Hint: You will need to rewrite or cast the expression.
  Position: 43]

我尝试查找,但是似乎找不到可以作为pgObject.setType()参数的所有字符串值。我也不确定如何将表达式从jsonb转换为jsonb[],除了使用setType()方法设置类型之外,是否还有其他方法。

非常感谢任何帮助。


为什么要使用 jsonb[]jsonb 内部有本地数组格式。使用 PostgreSQL 的 jsonb 值数组没有意义。 - Craig Ringer
基本上我想要一个JSONB值的数组。有些用户可能比其他用户有更多的兴趣爱好。每次他们添加关于特定兴趣的数据时,我需要将这些信息附加到用户上。我没有找到太多关于JSONB[]的信息,但它听起来像是一个JSONB值的数组。我想我可以将我的JSON包含在周围的花括号{}中,并尝试每次附加这个结构而不是覆盖它。我会尝试这个建议。 - kinghenry14
1
但是json有数组。只需提供一个单一的jsonb,其中顶层元素是包含json对象的json数组。 - Craig Ringer
1个回答

1
许多框架不支持SQL数组。虽然有一个SQL标准用于数组,但大多数客户端只部分支持或根本不支持。
在PostgreSQL中,type[]type的数组。因此,jsonb[]jsonb的数组。您的客户端似乎不理解这一点——它要么不支持数组,要么已经为每种数据类型特别处理了数组支持。
幸运的是,您不需要一个jsonb的SQL数组,因为jsonb存储JSON JavaScript序列化对象表示法。JSON定义了对象和数组。因此,您可以在jsonb字段内拥有一个对象数组。不需要SQL数组。
这是一个jsonb值的SQL数组,其中每个jsonb值都是单个对象(字典):
test=> SELECT ARRAY[
           '{ "x": 1, "y": 2 }',
           '{ "a": 3, "b": 4 }'
        ] :: jsonb[];
                        array                        
-----------------------------------------------------
 {"{ \"x\": 1, \"y\": 2 }","{ \"a\": 3, \"b\": 4 }"}
(1 row)

它的数据类型是jsonb[]。请注意使用PostgreSQL ARRAY[...]构造符号,以及包含json对象的'字符串字面量'位于数组内部
这是一个包含对象数组的单个jsonb字段:
test=> SELECT 
'
        [
                { "x": 1, "y": 2 },
                { "a": 3, "b": 4 }
        ]
' :: jsonb;
                jsonb                 
--------------------------------------
 [{"x": 1, "y": 2}, {"a": 3, "b": 4}]
(1 row)

请注意,这是一个包含对象数组的JSON序列化的单个字符串文字。

谢谢你提供这个信息!不幸的是,根据我在Stack上阅读到的其他帖子,特别是这个:https://dev59.com/H18d5IYBdhLWcg3wiit9,似乎在Postgres中仅仅追加这个结构并不容易。 我可能会尝试将此配置文件数据存储在另一层中,例如Redis或其他允许以更可管理的方式进行JSON更新的东西。 - kinghenry14
您可以按照文档中的说明,实现对自定义DB参数的支持。 - cchantep
@kinghenry14 PostgreSQL在新版本中继续添加更多操作JSON的函数,还有PL/V8支持。不过,在数据库内部使用它仍然有些受限。 - Craig Ringer
我目前的解决方法是从SQL中检索当前值,将字符串化的响应与要添加的下一个对象连接起来,然后再次调用插入到列函数。 - kinghenry14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接