#postgresql #api #rest #post #postgrest
#postgresql #API #rest #Публикация #postgrest
Вопрос:
Я использую postgrest
в качестве оболочки API для своей postgres
базы данных. API считывает мою схему базы данных и создает URL-адрес, используя общие символы в адресе.
У меня есть такая функция = create function api.dividend(p_stocks text[])
Общий вызов API:
/url?key=val;key2=val2
Мой вызов API для функции create function api.dividend(p_stocks text[])
:
/dividend?p_stocks=AAPL
В этом случае, чтобы проверить ситуацию, я использовал AAPL
в качестве входного параметра.
Однако это ошибка, которую я получаю:
function api.dividend(p_stock => text) does not exist
Как вы видите, ошибка возврата ожидает эту функцию, api.dividend(p_stock => text)
однако я попытался создать функцию с использованием этих параметров, и я не думаю, что это возможно…
Я был бы очень признателен за некоторые советы или предложения о том, какие предложения я должен попробовать?
Это не проблема схемы, потому что я проверил, находится ли функция в соответствующей схеме.
Вот полная функция из postgres, если это поможет:
create function dividend(p_stocks text[])
returns table(symbol char, next_dividend_date date, ex_dividend_date date)
as $
select distinct on (symbol) symbol, next_dividend_date, ex_dividend_date
from api.security_stats
where api.security_stats.symbol = any($1)
order by symbol, date desc
$ language sql;
Комментарии:
1. Ну, вы объявили
p_stocks
как текстовый массив. Почти уверен, что ошибка возникает из-за простой передачи ему текстовой строки вместо текстового массива. Postgres допускает перегрузку функции, поэтому она ищетcreate function dividend(p_stocks text)
и не находит ее, и, следовательно, возникает ошибка.2. Теперь я понимаю ошибку, я уже пробовал передавать ее подобным образом ранее
/dividend?p_stock=[AAPL]
, но все равно не смог заставить ее работать. Это так, как вы предполагали, будет выглядеть запрос?3. Нет, это закончилось бы так
create function dividend('[AAPL]')
, и это не то, как вы вводите массив. Это делается как » или'{AAPL}
илиARRAY['AAPL']
» . В какой-то момент процесса вы должны принять переданные параметры и преобразовать их в одну из приведенных выше форм перед использованием в функции. Я не используюpostgrest
, но я нашел это с помощью array4. О, вау, я был так сосредоточен на предыдущих сегментах документа, что полностью пропустил параметр массива! Имеет смысл, большое спасибо за вашу помощь!!
Ответ №1:
Мне удалось решить проблему с помощью @Adrian,
/dividend?p_stocks={AAPL}
Это был бы правильный путь URL для postgrest для использования функции / параметра. {
= {
, и }
= }
Теперь URL-адрес имеет правильный формат массива для моей функции.