PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Miglioramento di una funzione che UPSERT si basa su un array di input

Abbiamo molti server diversi che spingono fino ai tavoli centrali in Postgres, il che aggiunge un'altra ruga. Cosa succede se aggiungo una colonna alla mia tabella:

ALTER TABLE item ADD COLUMN category citext;

Ora la tabella ha quattro colonne invece di tre.

Tutti i miei push esistenti immediatamente break perché ora manca una colonna dagli input. C'è una probabilità dello 0% che possiamo aggiornare tutti i server contemporaneamente, quindi non è un'opzione.

Una soluzione è creare un tipo personalizzato per ogni versione della tabella:

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);

E poi una funzione per ogni 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.

Immagino che potresti avere un unico metodo gigantesco che accetta anyarray e utilizza un CASE per risolvere quale codice eseguire. Non lo farei per alcuni motivi, ma suppongo che potresti. (Ho visto quell'approccio trasformarsi in cancrena in più di una lingua in una vera fretta.)

Tutto ciò sembra un bel po' di lavoro. C'è una tecnica più semplice che mi sfugge? Immagino che potresti inviare testo strutturato/XML/JSON, decomprimerlo e lavorare da lì. Ma io non file che sotto "più semplice."

Sto ancora lavorando al design qui, ovviamente. Ho scritto abbastanza codice per testare ciò che ho mostrato, ma voglio chiarire i dettagli prima di tornare indietro e implementarlo su dozzine di tabelle.

Grazie per qualsiasi aiuto.