我们有大量的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并花一些时间进行重写。
答案 0 :(得分:2)
在json
和jsonb
之间引入隐式广播很简单,但你不应该这样做。尽管烦恼,但调整代码是正确的做法。
原因是当您在json
和jsonb
之间进行投射时,会产生重大影响。 PostgreSQL必须将json解析为哈希表,或者将jsonb哈希表格式化为平面json文本。大量内存分配,大量处理器工作,大量CPU缓存流失。你不想一直这样做。
还存在语义差异。特别是,jsonb
不会保留对象中键的顺序,也不会保留重复键。 json
。因此some_json_col :: jsonb :: json
与some_json_col
不同。
一个体面的文本编辑器和查找/替换将使您的工作非常简单,即使是大量的代码。是时候进行编辑了。