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

Forbedring af en funktion, som UPSERTs baseret på et input-array

Vi har en masse forskellige servere, der skubber op til centrale borde i Postgres, hvilket tilføjer endnu en rynke. Hvad hvis jeg tilføjer en kolonne til min tabel:

ALTER TABLE item ADD COLUMN category citext;

Nu har tabellen fire kolonner i stedet for tre.

Alle mine eksisterende push med det samme pause, fordi der nu mangler en kolonne i inputs. Der er en 0% chance for, at vi kan opdatere hele serveren samtidigt, så det er ikke en mulighed.

En løsning er at oprette en brugerdefineret type for hver version af tabellen:

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

Og så en funktion for hver type:

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.

Jeg gætter på, at du kunne have en enkelt enorm metode, der tager ethvert array og bruger en CASE til at finde ud af, hvilken kode der skal køres. Jeg ville ikke gøre det af et par grunde, men jeg formoder, at du kunne. (Jeg har set den tilgang blive koldbrand på mere end ét sprog i virkelig hast.)

Alt det virker som en del arbejde. Er der en enklere teknik, jeg mangler? Jeg forestiller mig, at du kunne indsende struktureret tekst/XML/JSON, pakke den ud og arbejde derfra. Men jeg ville ikke fil det under "simpler."

Jeg arbejder naturligvis stadig gennem designet her. Jeg har skrevet nok kode til at teste det, jeg har vist, men vil gerne sortere detaljerne, før jeg går tilbage og implementerer dette på snesevis af tabeller.

Tak for enhver hjælp.



  1. UTF-8 hele vejen igennem

  2. Sorter efter kolonne ASC, men NULL-værdier først?

  3. date_trunc 5 minutters interval i PostgreSQL

  4. Eksporter tabeldata fra en SQL Server til en anden