1

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

我们希望随着时间的推移将代码转换为 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 /update 并为重写争取一些时间。

4

1 回答 1

2

json在and之间引入隐式转换很简单jsonb,但您不应该这样做。尽管很烦人,但调整代码是正确的做法。

原因是,当您在两者之间进行转换时jsonjsonb您会受到显着的性能影响。PostgreSQL 必须将 json 解析为哈希表,或者将 jsonb 哈希表格式化回平面 json 文本。大量的内存分配,大量的处理器工作,大量的 CPU 缓存流失。你不想一直这样做。

还有语义上的差异。特别是,jsonb不保留对象中键的顺序,也不保留重复的键。json做。所以some_json_col :: jsonb :: json不一样some_json_col

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

于 2015-08-13T00:44:29.657 回答