es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  ,

Answer

  1. Avatar for 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ámetro ids 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ámetro ids de la siguiente manera:

    let payload = {ids: '{1,2,3}'::bigint[], date: '2021-09-08'}
    

    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ámetro date 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:

    let payload = {ids: [1,2,3], date: '2021-09-08'}
    return await RequestService.postData(new URL(this.api + `/rpc/movement`), payload);
    

    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.

Comments are closed.