Como controlar o esquema do PostgreSQL com comentários?

9

Eu controle a versão da maior parte do meu trabalho com o Git : código, documentação, configuração do sistema. Sou capaz de fazer isso porque todo o meu valioso trabalho é armazenado como arquivos de texto.

Também escrevi e lidei com muitos esquemas SQL para nosso banco de dados Postgres. O esquema inclui visões, funções SQL e escreveremos funções do Postgres na linguagem de programação R (via PL / R ).

Eu estava tentando copiar e colar o esquema de partes que eu e meus colaboradores escrevemos, mas esqueço de fazer isso. A cópia e a ação passada são repetitivas e propensas a erros.

O método pg_dump / pg_restore não funcionará porque perde comentários.

Idealmente, eu gostaria de ter uma maneira de extrair meu esquema atual em um arquivo ou arquivos e preservar os comentários para que eu possa fazer o controle de versão.

Qual é a melhor prática para o esquema de controle de versão com comentários?

Aleksandr Levchuk
fonte
2
Eu não acho que a questão seja específica do psql. Você já leu algumas das respostas em SO stackoverflow.com/… ? Pode haver algo para você.
DrColossos
@DrColossos - algumas dessas perguntas são boas candidatas à migração.
CoderHawk #
O @DrColossos está COMMENT ONdisponível em um ambiente não postgres? Eu não acho que é SQL padrão. o que significa que isso pode ser específico do postgres.
Xenoterracide
@xenoterracide Você está certo, eu estava mais falando sobre o problema do controle de versão de um banco de dados em si
DrColossos

Respostas:

9

Por que você não usa COMMENT ONos vários SCHEMAcomponentes, para que seus comentários estejam no esquema e serão descartados.

COMMENT armazena um comentário sobre um objeto de banco de dados.
Para modificar um comentário, emita um novo comando COMMENT para o mesmo objeto. Apenas uma sequência de comentários é armazenada para cada objeto. Para remover um comentário, escreva NULL no lugar da sequência de texto. Os comentários são descartados automaticamente quando o objeto é descartado.

xenoterracida
fonte
Verdadeiramente útil, mas não quero marcar isso como Resposta ainda porque espero obter uma resposta sobre as práticas recomendadas.
Aleksandr Levchuk 28/02
2

Os esquemas de controle de versão sempre foram problemáticos para mim. Geralmente controlo a versão do esquema gerado pela ferramenta de modelagem de dados que estou usando. O modelo também é controlado por versão. Eu uso diffs entre o esquema atual e o anterior para criar o patch necessário para atualizar o esquema. Algumas ferramentas de modelagem criam scripts de atualização de esquema utilizáveis. Os scripts de atualização também são controlados por versão.

Ocasionalmente, vejo scripts destinados a despejar o esquema em um formato adequado para regenerar o esquema. Um deles pode ser o que você está procurando. Algumas das ferramentas de modelagem e consulta são capazes de criar scripts de regeneração de esquema de um esquema existente. Se você pode criar um script, poderá fornecer um arquivo adequado para controle de versão.

BillThor
fonte
2

Uma alternativa (ou você pode combiná-los) à minha proposta anterior é escrever seu código SQL no seu editor (IDE), salvar os arquivos e enviá-los ao seu VCS, depois executar o código no banco de dados usando psql -1f. Dessa forma, o código é controlado por versão antes de ser executado.

xenoterracida
fonte
"Desta forma, o código é controlado por versão antes de ser executado." E deveria ser.
Mike Sherrill 'Cat Recall'
@catcall sim, mas se você ler o post das operações, não acho que seja esse o caso.
Xenoterracide
Infelizmente, não é o caso na maioria dos lugares que já vi. Mas essa é a única maneira de garantir que o código que você testa e o controle de qualidade seja o mesmo que você move para a produção. A idéia de que o banco de dados "verdadeiro" esteja no VCS, não no DBMS, não é generalizada.
Mike Sherrill 'Cat Recall'
0

Estou trabalhando em um projeto semelhante. Esta é a minha proposta de design:

  1. Comentar objetos de banco de dados regularmente, digamos, a cada duas semanas ou duas vezes por mês.
  2. não pg_dump todos (sim obter tudo para ter certeza de obter todos os pequenos detalhes e relacionamentos). Nomeie-os por aaaammdd-VERSION.dump
  3. Se estiver usando o Git, use um plugin para arquivos grandes
  4. Se não estiver usando um repositório, crie uma tabela simples no formato .CSV de texto, como a tabela abaixo:

    version | file name | date | description | 1.0 | yyyymmdd-v10.dump | yyyymmdd | new version of user table | 1.1 | backupDB-v11.dump | yyyymmdd | normalized reports tables |

  5. mantendo um relacionamento no arquivo CSV dos despejos gerados por nome de arquivo, você pode rastreá-los de alguma maneira facilmente e garantir que a restauração funcione porque você despejou absolutamente tudo.

Hoje em dia, qualquer armazenamento na nuvem ou no local não deve ser tão caro, mesmo que se trate de TBs de dados. existem alguns preços entre 700 e 1000 USD com até 16 TB .

Você pode até economizar muito mais $$$ se mudar para uma nuvem de armazenamento como as mais populares da AWS S3

Se um bom design e os padrões da organização são definidos para acompanhar toda a infraestrutura e ativos de TI, não deve ser doloroso uma vez implementado, pode ser relativamente simples e economizará as dores da configuração e, o mais importante, o tempo ...

Andres Leon Rangel
fonte