PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verbesserung einer Funktion, die UPSERT basierend auf einem Eingabearray durchführt

Wir haben viele verschiedene Server, die auf zentrale Tabellen in Postgres hochschieben, was eine weitere Falte hinzufügt. Was ist, wenn ich meiner Tabelle eine Spalte hinzufüge:

ALTER TABLE item ADD COLUMN category citext;

Jetzt hat die Tabelle vier statt drei Spalten.

Alle meine bestehenden Pushs sofort break, weil jetzt eine Spalte in den Eingaben fehlt. Es besteht eine Chance von 0 %, dass wir alle Server gleichzeitig aktualisieren können, also ist das keine Option.

Eine Lösung besteht darin, für jede Version der Tabelle einen benutzerdefinierten Typ zu erstellen:

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

Und dann eine Funktion für jeden 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.

Ich schätze, Sie könnten eine einzige gigantische Methode haben, die ein beliebiges Array nimmt und einen CASE verwendet, um herauszufinden, welcher Code ausgeführt werden soll. Ich würde das aus ein paar Gründen nicht tun, aber ich nehme an, Sie könnten es. (Ich habe gesehen, wie dieser Ansatz in mehr als einer Sprache in großer Eile gangränös wurde.)

All das scheint ein ziemliches Stück Arbeit zu sein. Gibt es eine einfachere Technik, die ich vermisse? Ich stelle mir vor, dass Sie strukturierten Text/XML/JSON einreichen, entpacken und von dort aus arbeiten könnten. Aber ich würde nicht Datei das unter "einfacher."

Ich arbeite hier natürlich noch am Design. Ich habe genug Code geschrieben, um zu testen, was ich gezeigt habe, aber ich möchte die Details klären, bevor ich zurückgehe und dies in Dutzenden von Tabellen implementiere.

Danke für jede Hilfe.