sql >> Database >  >> RDS >> PostgreSQL

Verbetering van een functie die UPSERT op basis van een invoerarray

We hebben veel verschillende servers die naar de centrale tafels in Postgres pushen, wat nog een rimpeltje toevoegt. Wat als ik een kolom aan mijn tabel toevoeg:

ALTER TABLE item ADD COLUMN category citext;

Nu heeft de tabel vier kolommen in plaats van drie.

Al mijn bestaande pushes onmiddellijk breken omdat er nu een kolom ontbreekt in de invoer. Er is een kans van 0% dat we de hele server tegelijk kunnen updaten, dus dat is geen optie.

Een oplossing is om een ​​aangepast type te maken voor elke versie van de tabel:

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

En dan een functie voor elk 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.

Ik denk dat je een enkele gigantische methode zou kunnen hebben die een willekeurige array gebruikt en een CASE gebruikt om uit te zoeken welke code moet worden uitgevoerd. Ik zou dat om een ​​paar redenen niet doen, maar ik veronderstel dat u dat wel zou kunnen. (Ik heb gezien dat die benadering in meer dan één taal met grote haast gangreen werd.)

Dat lijkt allemaal nogal wat werk. Is er een eenvoudigere techniek die ik mis? Ik stel me voor dat je gestructureerde tekst/XML/JSON zou kunnen indienen, uitpakken en van daaruit verder werken. Maar ik zou niet bestand dat onder "eenvoudiger."

Ik ben natuurlijk nog steeds bezig met het ontwerp hier. Ik heb genoeg code geschreven om te testen wat ik heb laten zien, maar ik wil de details uitzoeken voordat ik terugga en dit op tientallen tabellen implementeer.

Bedankt voor alle hulp.



  1. Bereken MD5-hash van een UTF8-tekenreeks

  2. ODBC-toepassingen verbinden met MySQL

  3. SELECT / GROUP BY - tijdssegmenten (10 seconden, 30 seconden, enz.)

  4. Hoe de MySQL-tabelgrootte voor tabellen in de database te krijgen?