Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Processo de manutenção evolutiva de modelo de...

Processo de manutenção evolutiva de modelo de dados: Estudo de caso PostgreSQL e Git

Versionamento de modelo de dados utilizando como caso de uso o banco de dados PostgreSQL e o DVCS Git.

Leonardo Cezar

November 08, 2011
Tweet

More Decks by Leonardo Cezar

Other Decks in Programming

Transcript

  1. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Características • Acompanhamento do

    histórico de mudanças; • Entender quando e porque foi feita uma alteração; • Consolidação de versões (merging); • Geração de baselines e “ramificações”; • Controlar alterações; • Aplicar alterações Controle de versão Controle de versão
  2. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Vantagens • Acompanhar o

    histórico de mudanças; • Entender quando e porque foi realizada uma alteração; • Consolidação de modelos (merging); • Geração de baselines (versões) e “ramificações”; • Controlar alterações; Versionamento de DDL Versionamento de DDL
  3. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Problema: • As alterações

    devem refletir as instruções ALTER ou correspondente. • • • • Por exemplo: Versionamento de DDL Versionamento de DDL CREATE TABLE pessoa( id INTEGER ,nome TEXT ,idade INTEGER ); ALTER TABLE [ ONLY ] name [ * ] action [, ... ]
  4. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 Exemplo Não leve a sério

    ... $ touch modelo.sql [alterações em modelo.sql] $ cp modelo.sql modelo_20101110.sql Controle de versão Controle de versão
  5. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Modelo • Centralizado: –

    Repositório central – Operações atômicas no repos central; – Trabalho compartilhado; • Distribuído: – Repositórios descentralizados – Não existe ponto único de falha – Operações de gravação otimizada – Compatível com modelo centralizado RVCS RVCS
  6. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Ferramentas • Subversion •

    CVS (ugh!) • Bazaar • Mercurial • Git • Codeville • Arch • [...] Controle de versão Controle de versão
  7. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 ... mas qual a melhor

    ferramenta? “A questão fundamental a ser considerada são os tipos de arquivos que sua equipe trabalha e como você deseja que os membros de sua equipe interajam.” Bryan O'Sullivan “Por uma questão democrática utilizaremos o git” Leonardo Cezar Controle de versão Controle de versão
  8. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 $ git checkout -b pessoa

    $ touch modelo.sql $ git add modelo.sql [alterações em modelo.sql] $ git commit -m 'criado atributo idade' $ […] $ […] $ […] $ git merge • Como funciona? • Pronto!!! Controle de versão Controle de versão
  9. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Diferenciar $ diff modelo.sql

    modelo_20101110.sql > a.patch $ cat a.patch --- a/modelo.sql +++ b/modelo.sql @@ -1,4 +1,5 @@ CREATE TABLE pessoa( id INTEGER ,nome TEXT + ,idade INTEGER ); Controle de versão Controle de versão
  10. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Diferenciar com git $

    git diff diff --git a/modelo.sql b/modelo.sql index 8dab7b0..f7c2e68 100644 --- a/modelo.sql +++ b/modelo.sql @@ -1,4 +1,5 @@ CREATE TABLE pessoa( id INTEGER ,nome TEXT + ,idade INTEGER ); Controle de versão Controle de versão
  11. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Qual o problema? $

    vim modelo.sql CREATE TABLE pessoa( id INTEGER ,nome TEXT ); $ cat modelo.sql | psql CREATE TABLE Controle de versão Controle de versão
  12. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Qual o problema? $

    vim modelo.sql CREATE TABLE pessoa( id INTEGER ,nome TEXT ,idade INTEGER ); $ git commit -am 'adicionado atributo idade' $ cat modelo.sql | psql ERROR: relation "pessoa" already exists Controle de versão Controle de versão
  13. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Utilizando git-diff? $ git

    diff diff --git a/modelo.sql b/modelo.sql index 8dab7b0..f7c2e68 100644 --- a/modelo.sql +++ b/modelo.sql @@ -1,4 +1,5 @@ CREATE TABLE pessoa( id INTEGER ,nome TEXT + ,idade INTEGER ); $ git diff HEAD^ | psql ERROR: syntax error at or near "diff" LINE 1: diff ^ Controle de versão Controle de versão
  14. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Solução: apgdiff http://apgdiff.startnet.biz/ •

    Comparação semântica de DDL; • Ferramenta multiplataforma de CA/SL; • Suporte a diversas instruções: – CREATE|ALTER TABLE – CREATE|ALTER VIEW – CREATE FUNCTION – COMMENT – SEQUENCES Controle de versão Controle de versão
  15. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Sim, com apgdiff “nós

    podemos!!” • • • No entanto, dependemos de dois arquivos de entrada: $ apgdiff modelo.sql modelo_v2010.sql ALTER TABLE pessoa ADD COLUMN idade INTEGER; $ apgdiff --help Usage: apgdiff [options] <old_dump> <new_dump> Controle de versão Controle de versão
  16. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Voltando um pouco ...

    • Git trabalha com branches e podemos visualiza-los através de git-branch: • E mudar de ramo com o comando checkout: $ git branch * master pessoa salario $ git checkout pessoa master * pessoa salario Controle de versão Controle de versão
  17. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 Gerenciamento de Gerenciamento de branches

    branches 2 1 master pessoa • Arquivo modelo.sql branch 3 branch salario 4 6 5 8 7 merge
  18. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • É possível verificar diferenças

    entre dois branches: … mas ainda assim não resolve $ git diff master pessoa diff --git a/modelo.sql b/modelo.sql index 8dab7b0..f7c2e68 100644 --- a/modelo.sql +++ b/modelo.sql @@ -1,4 +1,5 @@ CREATE TABLE pessoa( id INTEGER ,nome TEXT + ,idade INTEGER ); Controle de versão Controle de versão
  19. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Definindo uma ferramenta de

    diff externo • ou preferencialmente: .git/config cat > $HOME/bin/diff-ext.sh <<EOF $PATH_TO_PGDIFF/apgdiff "\$2" "\$5" EOF $ export GIT_EXTERNAL_DIFF=$HOME/bin/diff-ext.sh Controlando alterações DDL Controlando alterações DDL [diff] external = /Users/lhcezar/bin/diff-ext.sh
  20. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 • Utilizando a nova ferramenta

    de diff externo $ git diff master pessoa ALTER TABLE pessoa ADD COLUMN idade INTEGER; Controlando alterações DDL Controlando alterações DDL $ git diff pessoa master ALTER TABLE pessoa DROP COLUMN idade;
  21. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 Acompanhando mudanças Acompanhando mudanças •

    Visualizando mudanças $ git blame modelo.sql 59dc48f8 (Huguinho 2010-10-10 14:18:08 -0200 1) CREATE TABLE pessoa( 60ec4876 (Huguinho 2010-10-10 14:18:08 -0200 2) id INTEGER 46eg758c (Zezinho 2010-11-10 15:20:08 -0200 3) ,nome TEXT 876ce509 (Luizinho 2010-11-10 15:51:15 -0200 4) ,idade INTEGER 14cf1123 (Huguinho 2010-10-10 14:18:08 -0200 5) );
  22. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 Interagindo com o banco Interagindo

    com o banco $ git diff master pessoa | psql ALTER TABLE • Aplicar mudanças do branch no banco • Desfazer mudanças $ git diff pessoa master | psql ALTER TABLE
  23. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 Comparação de esquema físico Comparação

    de esquema físico • Algo um pouco mais interessante: $ pg_dump -U postgres -st pessoa | git diff master -- ALTER TABLE pessoa ADD COLUMN idade INTEGER; CREATE TABLE salario ( id INTEGER, id_pessoa INTEGER, valor numeric(12,6) );
  24. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 Outras utilidades Outras utilidades •

    Acompanhar logs de gravação (git log) • Organizar o histórico de gravações (git rebase) • Enviar alterações por e-mail (git format-patch) • Compartilhar área de trabalho (git pull) • Trabalhar em modelos remotos (git clone) • Criar unidades de testes (pgTAP)
  25. PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 Agradecimentos Agradecimentos Tom Lane Bruce

    Momjian Dave Page Peter Eisentraut Miroslav Šulc Linus Torvalds Shawn O Pearce Junio C Hamano Eliane Domingos &t. all Muito obrigado! [email protected]