PostgreSQL www.postgresql.org.br [email protected] www.latinoware.org 2010 Processo de manutenção evolutiva de modelo de dados: Estudo de caso PostgreSQL e Git Leonardo Cezar
PostgreSQL
www.postgresql.org.br [email protected] 2010
Processo de manutenção evolutiva de modelo de dados: Estudo de caso
PostgreSQL e Git
Leonardo Cezar
PostgreSQL
www.postgresql.org.br [email protected] 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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 DDLVersionamento de DDL
PostgreSQL
www.postgresql.org.br [email protected] 2010
● Problema:● As alterações devem refletir as instruções ALTER
ou correspondente.●
●
●
● Por exemplo:
Versionamento de DDLVersionamento de DDL
CREATE TABLE pessoa( id INTEGER ,nome TEXT ,idade INTEGER);
ALTER TABLE [ ONLY ] name [ * ] action [, ... ]
PostgreSQL
www.postgresql.org.br [email protected] 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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
RVCSRVCS
PostgreSQL
www.postgresql.org.br [email protected] 2010
● Ferramentas● Subversion● CVS (ugh!)● Bazaar● Mercurial● Git● Codeville● Arch● [...]
Controle de versãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 2010
● Diferenciar com git
$ git diffdiff --git a/modelo.sql b/modelo.sqlindex 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 2010
● Qual o problema?
$ vim modelo.sqlCREATE TABLE pessoa( id INTEGER ,nome TEXT);
$ cat modelo.sql | psql CREATE TABLE
Controle de versãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 2010
● Qual o problema?
$ vim modelo.sqlCREATE 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 2010
● Utilizando git-diff?$ git diffdiff --git a/modelo.sql b/modelo.sqlindex 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 2010
Gerenciamento de Gerenciamento de branchesbranches
2
1
master
pessoa
● Arquivo modelo.sql
bran
ch
3
branch
salario
4
6
5 8
7
merge
PostgreSQL
www.postgresql.org.br [email protected] 2010
● É possível verificar diferenças entre dois branches:
… mas ainda assim não resolve
$ git diff master pessoadiff --git a/modelo.sql b/modelo.sqlindex 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ãoControle de versão
PostgreSQL
www.postgresql.org.br [email protected] 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 DDLControlando alterações DDL
[diff] external = /Users/lhcezar/bin/diff-ext.sh
PostgreSQL
www.postgresql.org.br [email protected] 2010
● Utilizando a nova ferramenta de diff externo
$ git diff master pessoa
ALTER TABLE pessoa ADD COLUMN idade INTEGER;
Controlando alterações DDLControlando alterações DDL
$ git diff pessoa master
ALTER TABLE pessoa DROP COLUMN idade;
PostgreSQL
www.postgresql.org.br [email protected] 2010
Acompanhando mudançasAcompanhando 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 INTEGER46eg758c (Zezinho 2010-11-10 15:20:08 -0200 3) ,nome TEXT876ce509 (Luizinho 2010-11-10 15:51:15 -0200 4) ,idade INTEGER14cf1123 (Huguinho 2010-10-10 14:18:08 -0200 5) );
PostgreSQL
www.postgresql.org.br [email protected] 2010
Interagindo com o bancoInteragindo com o banco
$ git diff master pessoa | psqlALTER TABLE
● Aplicar mudanças do branch no banco
● Desfazer mudanças
$ git diff pessoa master | psqlALTER TABLE
PostgreSQL
www.postgresql.org.br [email protected] 2010
Comparação de esquema físicoComparaçã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));
PostgreSQL
www.postgresql.org.br [email protected] 2010
Outras utilidadesOutras 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)
PostgreSQL
www.postgresql.org.br [email protected] 2010
AgradecimentosAgradecimentosTom Lane
Bruce MomjianDave Page
Peter Eisentraut Miroslav ŠulcLinus Torvalds
Shawn O PearceJunio C HamanoEliane Domingos
&t. all
Muito [email protected]