Передача массива в триггерную функцию tsvector в Postgres - PullRequest
1 голос
/ 06 февраля 2020

Я создаю столбец tsvector и следую великолепной документации Postgres, чтобы создать функцию триггера:

https://www.postgresql.org/docs/9.5/textsearch-features.html#TEXTSEARCH -UPDATE-TRIGGERS

Я столкнулся с проблемой, хотя, и это один из моих столбцов представляет собой массив строк. Когда я пытаюсь установить эту функцию триггера, я получаю сообщение об ошибке:

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON photos FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(tsv, 
                        'pg_catalog.english', 
                        title, 
                        description, 
                        array_to_string(tags, ' ')); -- this is the problematic line

Вот ошибка, которую я получаю:

ERROR:  syntax error at or near "("
LINE 8:   array_to_string(tags, ' ') );
                        ^
SQL state: 42601
Character: 197

Есть ли лучший способ передать массив?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Я думаю, что встроенная функция принимает только текстовые или совместимые типы текстовых данных.

Я понимаю, что это намного больше работы, чем использование встроенной, но вы всегда можете написать свою собственную функцию триггера, так как она может получить доступ ко всей записи (как NEW). Я делаю некоторые предположения относительно вашей таблицы.

create or replace function photos_insert_update_trigger()
returns trigger
language plpgsql as
$BODY$
  BEGIN
    NEW.tsv := to_tsvector ('english',
      NEW.title || ' ' ||
      NEW.description || ' ' ||
      array_to_string (NEW.tags, ' '));
    return NEW;
  END;
$BODY$;

create trigger insert_update_photos_trigger
before insert or update on photos
for each row
execute procedure photos_insert_update_trigger();

insert into photos (title, description, tags)
values ('Spaceballs', 'Mel Brooks Star Wars', array['Dark Helmet', 'Yogurt']);

Я не слишком много работаю с цветообразователями, так что, возможно, моя интерпретация того, как текст превращается в цветектор, может быть немного неправильной, но Нижняя строка с вашей собственной триггерной функцией, вы будете иметь полную гибкость в том, как вы хотите справиться с этим.

0 голосов
/ 06 февраля 2020

Приведенный выше ответ работает, но, к вашему сведению, я настроил функцию объединения, вот что я использовал в итоге:

CREATE FUNCTION photos_trigger() RETURNS trigger AS $$
begin
  new.tsv :=
    to_tsvector('english', 
      coalesce(new.title, '') || ' ' ||
      coalesce(new.description, '') || ' ' ||
      coalesce(array_to_string(new.tags, ' '), ''));
  return new;
end
$$ LANGUAGE plpgsql;

CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON photos FOR EACH ROW EXECUTE PROCEDURE photos_trigger();
...