PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Ulepszenie funkcji, którą UPSERTs opiera na tablicy wejściowej

Mamy wiele różnych serwerów, które pchają się do centralnych stołów w Postgresie, co dodaje kolejną zmarszczkę. Co się stanie, jeśli dodam kolumnę do tabeli:

ALTER TABLE item ADD COLUMN category citext;

Teraz tabela ma cztery kolumny zamiast trzech.

Wszystkie moje dotychczasowe pushe natychmiast przerwać, ponieważ teraz w danych wejściowych brakuje kolumny. Istnieje 0% szansy, że możemy zaktualizować cały serwer jednocześnie, więc nie ma takiej opcji.

Jednym z rozwiązań jest utworzenie niestandardowego typu dla każdej wersji tabeli:

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

A potem funkcja dla każdego typu:

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.

Myślę, że możesz mieć jedną ogromną metodę, która pobiera dowolną tablicę i używa CASE do uporządkowania kodu do uruchomienia. Nie zrobiłbym tego z kilku powodów, ale przypuszczam, że możesz. (Widziałem, jak to podejście zmienia się w gangrenę w więcej niż jednym języku w naprawdę pośpiechu).

Wszystko to wydaje się być niezłą pracą. Czy brakuje mi prostszej techniki? Wyobrażam sobie, że możesz przesłać strukturalny tekst/XML/JSON, rozpakować go i stamtąd pracować. Ale nie plik, który pod "prostszym".

Oczywiście nadal pracuję nad projektem tutaj. Napisałem wystarczająco dużo kodu, aby przetestować to, co pokazałem, ale chcę uporządkować szczegóły przed powrotem i zaimplementowaniem tego na dziesiątkach tabel.

Dzięki za wszelką pomoc.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zarządzanie kolejnym Commitfestem PostgreSQL

  2. SQLAlchemy wiele kluczy obcych w jednej zmapowanej klasie do tego samego klucza podstawowego

  3. Oracle do PostgreSQL:ROZPOCZNIJ OD/POŁĄCZ PRZEZ

  4. Zapisz dane wyjściowe z funkcji sql do pliku csv (KOPIUJ) z dynamiczną nazwą pliku

  5. Importuj zrzut MySQL do bazy danych PostgreSQL