Tengo un dominio que representa una matriz de enteros, creado con CREATE DOMAIN x AS integer[] . Tengo un campo en una tabla que tiene tipo x[] , es decir, una matriz de matrices de enteros. He hecho esto (a diferencia de integer[][] ) para permitir matrices de longitud mixta (ver esta respuesta ).
Insertar la expresión {{1, 2}, {3, 4, 5}} se vería así:
INSERT INTO table (column) VALUES (ARRAY[ARRAY[1, 2]::x, ARRAY[3, 4, 5]::x]) Sin el dominio (es decir, cuando la column es de tipo integer[][] ), puedo usar pg-promise para insertar la matriz multidimensional anterior:
const arr = [[1, 2], [3, 4, 5]]; await db.query('INSERT INTO table (column) VALUES ($1)', arr);Y selecciónalo:
const result = await db.query('SELECT column FROM table'); result[0].column[1][2] // => 5Pero esto, por supuesto, tiene la limitación mencionada al principio, que SQL (o al menos Postgres) no permite matrices multidimensionales con filas de diferentes longitudes.
Seleccionar una columna de tipo x[] con pg-promise de la misma manera que arriba da como resultado una cadena, e insertar una matriz sin formato (como arriba) arroja un error comprensiblemente ("la columna es de tipo x[] pero la expresión es de tipo entero[]"). Agregar ::x[] (es decir, INSERT INTO table (column) VALUES ($1::x[]) también arroja un error, "no se puede convertir el tipo entero a x", que también tiene sentido.
Entonces mi pregunta es, ¿cuál es la mejor manera de seleccionar e insertar campos que son matrices de un dominio con pg-promise? Miré el formato de tipo personalizado, pero no estoy seguro de que funcione para seleccionar. ¡Gracias!