1

客观的:

  • 使用 PostgreSQL FTS 创建全文搜索引擎。

填充tsvector:

我有一个 tsvector 列。为了填充 tsvector 列,我正在执行一个触发器,该触发器调用一个执行自定义 PL/Python 函数的过程。

后续步骤:

触发器和过程函数

它类似于https://www.postgresql.org/docs/10/textsearch-features.html#TEXTSEARCH-UPDATE-TRIGGERS触发器,它调用messages_trigger过程(用 plpgsql 编写)。

但我调用的不是coalesce(new.title,'')and ,而是一个UDF,它具有文本数组作为输入参数。coalesce(new.body,'')

custom_udf(p_arr ARRAY)

错误:

在摄取数据期间,它会引发错误:

psycopg2.errors.UndefinedObject: type p_arr[] does not exist

问题:

Pl/Python 函数不允许使用ARRAY类型参数吗?

为了绕过这个问题,我正在对列表元素进行逗号分隔连接并将其传递给 custom_udf。在 custom_udf 中,我使用逗号分隔符拆分来取回列表。

4

1 回答 1

1

您使用的语法:

CREATE FUNCTION custom_udf(p_arr ARRAY) RETURNS ...;

意思是一样的

CREATE FUNCTION custom_udf(p_arr[]) RETURNS ...;

也就是说,具有一个未命名参数的函数,其数据类型为“array of p_arr”。所以 PostgreSQL 期望p_arr是一种数据类型,它解释了错误信息。

PostgreSQL 中没有“数组”数据类型,您总是必须命名元素类型,例如integer ARRAY,或等价的integer[].

所以,假设你想要一个字符串数组,你的定义应该看起来像

CREATE FUNCTION custom_udf(p_arr text[]) RETURNS ...;
于 2020-12-18T16:25:59.280 回答