sql >> Databasteknik >  >> RDS >> PostgreSQL

Förbättring av en funktion som UPSERT baseras på en inmatningsmatris

Vi har många olika servrar som skjuter upp till centrala tabeller i Postgres, vilket lägger till ytterligare en rynka. Vad händer om jag lägger till en kolumn i min tabell:

ALTER TABLE item ADD COLUMN category citext;

Nu har tabellen fyra kolumner istället för tre.

Alla mina befintliga push omedelbart bryta eftersom det nu saknas en kolumn i ingångarna. Det finns en 0% chans att vi kan uppdatera hela servern samtidigt, så det är inget alternativ.

En lösning är att skapa en anpassad typ för varje version av 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);

Och sedan en funktion för varje typ:

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.

Jag antar att du kan ha en enda enorm metod som tar vilken som helst array och använder ett CASE för att reda ut vilken kod som ska köras. Jag skulle inte göra det av flera anledningar, men jag antar att du kunde. (Jag har sett det tillvägagångssättet bli kallbrand på mer än ett språk i en riktig brådska.)

Allt det där verkar vara lite jobbigt. Finns det någon enklare teknik jag saknar? Jag föreställer mig att du kan skicka in strukturerad text/XML/JSON, packa upp den och arbeta därifrån. Men jag skulle inte fil det under "enklare."

Jag håller fortfarande på med designen här, så klart. Jag har skrivit upp tillräckligt med kod för att testa det jag har visat, men vill reda ut detaljerna innan jag går tillbaka och implementerar detta på dussintals tabeller.

Tack för all hjälp.



  1. UID – Returnera ID:t för den aktuella sessionen i Oracle

  2. Infoga en bild från Oracle i SQL Server

  3. SQL Server Interns:Problematiska operatörer Pt. II – Hashing

  4. Hur man ansluter till en MySQL-datakälla i Visual Studio