sql >> Base de Datos >  >> RDS >> PostgreSQL

Mejora de una función que UPSERT se basa en una matriz de entrada

Tenemos muchos servidores diferentes subiendo a las mesas centrales en Postgres, lo que agrega otra novedad. ¿Qué pasa si agrego una columna a mi tabla:

ALTER TABLE item ADD COLUMN category citext;

Ahora la tabla tiene cuatro columnas en lugar de tres.

Todos mis envíos existentes inmediatamente romper porque ahora falta una columna de las entradas. Hay un 0% de posibilidades de que podamos actualizar todo el servidor simultáneamente, por lo que no es una opción.

Una solución es crear un tipo personalizado para cada versión de la tabla:

CREATE TYPE item_v1 AS (
    id uuid,
    marked_for_deletion boolean,
    name_ citext);

CREATE TYPE item_v2 AS (
    id uuid,
    marked_for_deletion boolean,
    name_ citext,
    category citext);

Y luego una función para cada tipo:

CREATE OR REPLACE FUNCTION data.item_insert_array (data_in item_v1[]) 
etc.

CREATE OR REPLACE FUNCTION data.item_insert_array (data_in item_v2[]) 
etc.

Supongo que podrías tener un solo método enorme que tome cualquier matriz y use un CASO para determinar qué código ejecutar. Yo no haría eso por algunas razones, pero supongo que tú podrías. (He visto que ese enfoque se vuelve gangrenoso en más de un idioma con mucha prisa).

Todo eso parece bastante trabajo. ¿Hay una técnica más simple que me estoy perdiendo? Me imagino que podría enviar texto estructurado/XML/JSON, descomprimirlo y trabajar desde allí. Pero yo no archive eso bajo "más simple".

Todavía estoy trabajando en el diseño aquí, obviamente. He escrito suficiente código para probar lo que he mostrado, pero quiero resolver los detalles antes de volver atrás e implementar esto en docenas de tablas.

Gracias por cualquier ayuda.