3

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

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

4

2 回答 2

1

调用函数时将参数定义为text并强制转换为。text

于 2017-06-21T11:38:30.813 回答
0

我同意:缺乏anyelement是一个非常不便的遗漏。

一种解决方法是使用您在实践中遇到的各种类型来重载您的函数(假设它们是可枚举的并且不是太多)?

在实践中,对于 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。

于 2019-08-19T07:14:21.797 回答