PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Melhorando uma função que UPSERTs com base em uma matriz de entrada


Temos muitos servidores diferentes indo para as mesas centrais do Postgres, o que adiciona outro problema. E se eu adicionar uma coluna à minha tabela:
ALTER TABLE item ADD COLUMN category citext;

Agora a tabela tem quatro colunas em vez de três.

Todos os meus pushes existentes imediatamente break porque agora falta uma coluna nas entradas. Há uma chance de 0% de podermos atualizar todo o servidor simultaneamente, então isso não é uma opção.

Uma solução é criar um tipo personalizado para cada versão da tabela:
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);

E então uma função para cada tipo:
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.

Eu acho que você poderia ter um único método gigantesco que usa qualquer matriz e usa um CASE para resolver qual código executar. Eu não faria isso por algumas razões, mas suponho que você poderia. (Já vi essa abordagem se tornar gangrenada em mais de um idioma com muita pressa.)

Tudo isso parece um pouco de trabalho. Existe uma técnica mais simples que estou perdendo? Estou imaginando que você poderia enviar texto estruturado/XML/JSON, descompactá-lo e trabalhar a partir daí. Mas eu não arquivo isso em "simples".

Ainda estou trabalhando no design aqui, obviamente. Eu escrevi código suficiente para testar o que mostrei, mas quero resolver os detalhes antes de voltar e implementar isso em dezenas de tabelas.

Obrigado por qualquer ajuda.