Postgres JSON到JSONB

时间:2015-08-12 15:44:43

标签: json postgresql plpgsql jsonb

我们有大量的PLPGSQL代码,使用Postgres 9.3将json数据插入/更新到JSON列中

我们希望随着时间的推移转换代码以转换为JSONB格式,并利用更好的索引和新运算符。

有没有办法在不重写所有代码的情况下使用新的JSONB格式。

例如,我们有很多接受并返回JSON的函数,粗略的例子: -

FUNCTION foo(payload JSON) RETURNS JSON AS
$$
  BEGIN
  ...
  INSERT INTO baa(json, name) VALUES(payload, 'name');
  RETURN '{"message" : "done"}'::JSON

  END 
$$ LANGUAGE PLPGSQL;

我的理想是将json转换为jsonb,而不必重写函数。我尝试使用触发器函数在插入之前执行此操作但这不起作用,因为postgres查询语法检查器首先到达: -

ERROR:  column "json" is of type jsonb but expression is of type json

我怀疑我无能为力并且必须重写所有代码(1000行),但我想我会把它放在那里,看看是否有一个聪明的想法可以让我在插入/更新时执行CAST并花一些时间进行重写。

1 个答案:

答案 0 :(得分:2)

jsonjsonb之间引入隐式广播很简单,但你不应该这样做。尽管烦恼,但调整代码是正确的做法。

原因是当您在jsonjsonb之间进行投射时,会产生重大影响。 PostgreSQL必须将json解析为哈希表,或者将jsonb哈希表格式化为平面json文本。大量内存分配,大量处理器工作,大量CPU缓存流失。你不想一直这样做。

还存在语义差异。特别是,jsonb不会保留对象中键的顺序,也不会保留重复键。 json。因此some_json_col :: jsonb :: jsonsome_json_col不同。

一个体面的文本编辑器和查找/替换将使您的工作非常简单,即使是大量的代码。是时候进行编辑了。