#postgresql #postgrest
#postgresql #постгрест
Вопрос:
У меня есть функция PostgreSQL logschema.movement
, которая возвращает подмножество таблицы logschema.movement
, функция выглядит так:
CREATE OR REPLACE FUNCTION logschema.movement( "ids" bigint[], "date" TEXT) RETURNS SETOF logschema.movement LANGUAGE 'plpgsql' COST 100 VOLATILE AS $ BEGIN RETURN QUERY (SELECT * FROM logschema.movement WHERE "ids" = ANY ("ids") AND "day" gt;= $2::TIMESTAMP); END; $;
Эта функция работает в PostgreSQL, например SELECT logschema.movement(ARRAY[1,2,3], '2021-09-09')
, не возвращает ошибку. Если я попытаюсь запросить функцию с помощью PostgREST и axios, как это:
let payload = {ids: [1,2,3], date: "2021-09-08"} return await RequestService.postData(new URL(this.api `/rpc/movement`, this.urlBase), payload);
Я получаю длинное сообщение об ошибке, которое содержит:
... data: { hint: 'No function matches the given name and argument types. You might need to add explicit type casts.', details: null, code: '42883', message: 'function logschema.movement(lastBatteryChangeDate =gt; text, pseudoIds =gt; text) does not exist' } } ...
Мне кажется, что мой массив был преобразован в строку, но я не уверен.
Моя версия PostgreSQL PostgreSQL 12.8 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20210424) 10.3.1 20210424, 64-bit
и моя версия PostgREST v7.0.1
Комментарии:
1. Может быть, я ошибаюсь, но я понимаю, что вы передаете свои входные параметры через URL, так что да, они могут быть преобразованы в текст. Вы можете обновить свою функцию logschema.movement, объявив идентификаторы в виде текста, а затем преобразовать его в функции как bigint[] :
ANY ("ids" :: bigint[])
2. Это сработало, большое спасибо, совершенно забыл, что вы можете просто конвертировать приведение в массивы, а не только в примитивы