我正在使用(或尝试)以下功能:
CREATE FUNCTION replace_value(data JSON, key text, value anyelement)
RETURNS JSON AS $$
import json
d = json.loads(data)
d[key] = value
return json.dumps(d)
$$ LANGUAGE plpython3u;
正如我没想到的那样,这不起作用。 Postgres抱怨道:
ERROR: PL/Python functions cannot accept type anyelement
嗯......这很愚蠢,因为原生Python函数可以接受任何类型的任何东西,因为变量只是事物的名称。
在这种情况下,我无法关心值的实际类型,我只想更换它。我怎样才能在Postgres / PLPython中做这样的事情?
答案 0 :(得分:1)
将参数定义为text
并在调用函数时强制转换为text
。
答案 1 :(得分:0)
我同意:缺少anyelement
是一个非常不便的遗漏。
一种解决方法是将您的函数与您在实践中遇到的各种类型一起overload(假设它们是可枚举的并且不是太多)?
在实践中,对于JSON,您可能会放弃text,float和bigint?
CREATE FUNCTION replace_value(data JSON, key text, value text)...
CREATE FUNCTION replace_value(data JSON, key text, value float)...
CREATE FUNCTION replace_value(data JSON, key text, value bigint)...
n次重写代码可能很乏味,但是您可以将其自动化,例如使用python和psycopg2。