【问题标题】:PostgreSQL: PL/Python function not taking ARRAY input parameterPostgreSQL:PL/Python 函数不采用 ARRAY 输入参数
【发布时间】:2020-12-18 16:09:16
【问题描述】:

目标:

  • 使用 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,'')coalesce(new.body,''),而是UDF,它具有ARRAY 文本作为输入参数。

custom_udf(p_arr ARRAY)

错误:

在摄取数据期间,它会抛出错误:

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

问题:

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

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

【问题讨论】:

    标签: python postgresql plpython postgres-plpython


    【解决方案1】:

    你使用的语法:

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

    意思相同

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

    即,具有一个未命名参数的函数,其数据类型为“p_arr 数组”。所以 PostgreSQL 期望 p_arr 是一种数据类型,这解释了错误消息。

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

    所以,假设你想要一个字符串数组,你的定义应该是这样的

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

    【讨论】:

    • 如何从调用过程中传递列表?在触发过程中,如果我正在编写NEW.tsvector_report := to_tsvector('english', custom_udf(['elem1']),它会抛出错误:psycopg2.errors.SyntaxError: syntax error at or near "["postgresql.org/docs/10/arrays.html#ARRAYS-INPUT 中提到的传递数组的语法意味着将 python 列表 操作到 pgsql 数组 格式。有没有简单的方法可以做到这一点?
    • 在我看来,我最初将字符串传递给custom_udf 并在其中将文本拆分为列表的想法是一种更简单的方法。否则,这将意味着在 stackoverflow.com/a/20699609/282155 中完成的字符串操作
    • 您可以将字符串数组传递为'{string1,string2}'ARRAY['string 1', 'string 2']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2018-10-10
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2012-12-08
    相关资源
    最近更新 更多