我如何指出postgresql plpython函数参数可以是任何类型?

时间:2017-06-20 18:16:00

标签: postgresql plpython

我正在使用(或尝试)以下功能:

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中做这样的事情?

2 个答案:

答案 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。