PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Amélioration d'une fonction qui UPSERTs basée sur un tableau d'entrée

Nous avons beaucoup de serveurs différents poussant vers des tables centrales dans Postgres, ce qui ajoute une autre ride. Et si j'ajoute une colonne à mon tableau :

ALTER TABLE item ADD COLUMN category citext;

Maintenant, le tableau a quatre colonnes au lieu de trois.

Tous mes pushs existants immédiatement break car il manque maintenant une colonne dans les entrées. Il y a 0% de chance que nous puissions mettre à jour tout le serveur simultanément, donc ce n'est pas une option.

Une solution consiste à créer un type personnalisé pour chaque version du tableau :

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

Et puis une fonction pour chaque 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.

Je suppose que vous pourriez avoir une seule méthode gigantesque qui prend n'importe quel tableau et utilise un CASE pour trier le code à exécuter. Je ne le ferais pas pour plusieurs raisons, mais je suppose que vous le pouvez. (J'ai vu cette approche se gangrener dans plus d'une langue en un clin d'œil.)

Tout cela semble être un peu de travail. Y a-t-il une technique plus simple qui me manque? J'imagine que vous pourriez soumettre du texte structuré/XML/JSON, le décompresser et travailler à partir de là. Mais je ne le ferais pas classez-le sous "plus simple".

Je travaille toujours sur la conception ici, évidemment. J'ai écrit suffisamment de code pour tester ce que j'ai montré, mais je souhaite régler les détails avant de revenir en arrière et de l'implémenter sur des dizaines de tables.

Merci pour toute aide.