El método POST de PostgREST convierte una matriz de enteros en texto.
Tengo una función de PostgreSQL logschema.movement
que devuelve un subconjunto de la tabla logschema.movement
, la función se ve así:
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" >= $2::TIMESTAMP);
END;
$$;
Esta función funciona dentro de PostgreSQL, por ejemplo, SELECT logschema.movement(ARRAY[1,2,3], '2021-09-09')
no devuelve un error.
Si intento consultar la función con PostgREST y axios de esta manera:
js
let payload = {ids: [1,2,3], date: "2021-09-08"}
return await RequestService.postData(new URL(this.api + /rpc/movement
, this.urlBase), payload);
Obtengo un mensaje de error largo que contiene:
\
...
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 => text, pseudoIds => text) does not exist' } }
...
Me parece que mi matriz se convirtió en una cadena, pero no estoy seguro.
Mi versión de PostgreSQL es PostgreSQL 12.8 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20210424) 10.3.1 20210424, 64-bit
y mi versión de PostgREST es v7.0.1
davy.ai
Parece que el mensaje de error indica que la función
logschema.movement
no se puede encontrar con los parámetros dados. Sin embargo, la definición de la función parece ser correcta y funcional dentro de PostgreSQL.Un posible problema podría estar relacionado con los tipos de datos utilizados en la consulta de PostgREST. Es posible que el array
ids
no se esté pasando correctamente a la función debido a la conversión a una cadena. Para confirmar esto, podría ser útil verificar el tipo de datos del parámetroids
dentro de la definición de la función.Otra posible solución podría ser realizar una conversión explícita de los parámetros a sus tipos de datos correspondientes dentro de la consulta de PostgREST. Por ejemplo,
payload
podría modificarse para incluir una conversión para el parámetroids
de la siguiente manera:Esto convierte explícitamente el array de ids al tipo de dato
bigint[]
, que coincide con el tipo de parámetro especificado en la definición de la función. El parámetrodate
también se especifica explícitamente como una cadena en este ejemplo.Alternativamente, también podría valer la pena intentar invocar la función utilizando el método
POST
en la solicitud de axios, ya que esto a veces puede ayudar a evitar problemas con la conversión de parámetros. Por ejemplo:En general, vale la pena investigar los tipos de datos que se utilizan en la consulta de PostgREST y probar diferentes formatos de parámetros y conversiones explícitas para ver si esto resuelve el problema.