如何为play-scala anorm pgsql设置jsonb []的类型

时间:2015-08-02 22:24:16

标签: json postgresql scala anorm

我正在使用scala / play框架构建调查应用程序,并使用postgres9.4和anorm。我在其他地方使用jsonb作为数据类型但在一个位置我想使用jsonb []认为这个类型是jsonb值的数组。我的json结构如下:

    > z3 <- cbind(c(10,10,10,10));   
    > z3
         [,1]
    [1,]   10
    [2,]   10
    [3,]   10
    [4,]   10
    > m2
         [,1] [,2] [,3]
    [1,]    1    2    3
    [2,]    4    5    6
    [3,]    7    8    9
    [4,]   10   11   12
    > m2[,2]
    [1]  2  5  8 11
    > m3
         [,1] [,2] [,3] [,4]
    [1,]   10   10   10    8
    [2,]    1    1    1    1
    > m3 %*% m2[,2];
         [,1]
    [1,]  238
    [2,]   26
    > m3 %*% z3; 
         [,1]
    [1,]  380
    [2,]   40
    > 

这里每个兴趣都是json结构。我已经能够使用[ {"guitar":{"passion":3, "expertise":5, "willingToTeach":false, "lookingForOthers":false } }, {"soccer":{"passion":3, "expertise":3, "willingToTeach":true, "lookingForOthers":true } } ] 作为数据类型将json响应值添加到pgsql中的其他列,但是当我尝试使用jsonb时,我得到了投诉:jsonb[]在pgadmin3中,它实际上显示了我的确切数据类型:[PSQLException: Unknown type jsonb[].],用于我要插入的列。在我的anorm插入代码中,我尝试设置类型:

jsonb[]

但后来我收到了这个错误:

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

我试过看了这个,但我甚至无法找到我可以用作pgObject.setType()的参数的所有字符串值。我也不确定除了使用setType()方法设置类型之外,我将如何将表达式从[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] 转换为jsonb

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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[...]构造函数表示法,并注意包含'string literals'对象的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序列化的单个字符串文字。