【问题标题】:how to set type for jsonb[] for play-scala anorm pgsql如何为play-scala anorm pgsql设置jsonb []的类型
【发布时间】:2015-08-02 22:24:15
【问题描述】:

我正在 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[] 我要插入的列。在我的异常插入代码中,我尝试设置类型:

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() 参数的所有字符串值。除了使用 setType() 方法设置类型之外,我还不确定如何将表达式从 jsonb 转换为 jsonb[]

任何帮助将不胜感激。

【问题讨论】:

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

标签: json postgresql scala anorm


【解决方案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 对象的 'string literals' 位于数组内部

这是一个单独的 jsonb 字段,包含一个对象数组:

test=> SELECT 
'
        [
                { "x": 1, "y": 2 },
                { "a": 3, "b": 4 }
        ]
' :: jsonb;
                jsonb                 
--------------------------------------
 [{"x": 1, "y": 2}, {"a": 3, "b": 4}]
(1 row)

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

【讨论】:

  • 是的,谢谢!不幸的是,使用 postgres 附加这个结构似乎并不容易,因为我一直在阅读堆栈上的其他一些帖子,特别是这个:stackoverflow.com/questions/26703476/… 我可能会尝试将此配置文件数据存储在另一层中,例如 redis 或允许以更易于管理的方式更新 JSON 的东西
  • 您可以实现对自定义 DB 参数的支持,如 documentation 所示。
  • @kinghenry14 PostgreSQL 在新版本中继续添加更多用于操作 json 的功能,并且还有 PL/V8。在 db 中使用它确实有点受限。
  • 我现在的解决方法只是检索 SQL 中的当前值,将字符串化响应与我要添加的下一个对象连接起来,然后再次调用 insert into column 函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2013-01-19
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
相关资源
最近更新 更多