O documento discute o uso do sistema de controle de versão Git para gerenciar as alterações no modelo de dados do banco de dados PostgreSQL ao longo do tempo. Ele descreve como o Git pode ser usado para rastrear alterações no esquema do banco de dados, comparar versões diferentes e aplicar atualizações de esquema de forma controlada. Além disso, discute como ferramentas como o apgdiff podem ser integradas ao Git para comparar semanticamente alterações no DDL entre branches.
1. PostgreSQL
Processo de manutenção evolutiva de
modelo de dados: Estudo de caso
PostgreSQL e Git
Leonardo Cezar
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
2. PostgreSQL
Controle de versão
● 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
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
3. PostgreSQL
Versionamento de DDL
● 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;
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
4. PostgreSQL
Versionamento de DDL
● Problema:
● As alterações devem refletir as instruções ALTER
ou correspondente.
CREATE TABLE pessoa(
●
id INTEGER
,nome TEXT
●
,idade INTEGER
);
●
● Por exemplo:
ALTER TABLE [ ONLY ] name [ * ]
action [, ... ]
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
5. PostgreSQL
Controle de versão
Exemplo
$ touch modelo.sql
[alterações em modelo.sql]
$ cp modelo.sql modelo_20101110.sql
Não leve a sério ...
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
6. PostgreSQL
RVCS
● 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
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
8. PostgreSQL
Controle de versão
... 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
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
10. PostgreSQL
Controle de versão
● 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
);
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
11. PostgreSQL
Controle de versão
● 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
);
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
12. PostgreSQL
Controle de versão
● Qual o problema?
$ vim modelo.sql
CREATE TABLE pessoa(
id INTEGER
,nome TEXT
);
$ cat modelo.sql | psql
CREATE TABLE
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
13. PostgreSQL
Controle de versão
● 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
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
14. PostgreSQL
Controle de versão
● 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
^
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
15. PostgreSQL
Controle de versão
● 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
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
16. PostgreSQL
Controle de versão
● Sim, com apgdiff “nós podemos!!”
$ apgdiff modelo.sql modelo_v2010.sql
●
ALTER TABLE pessoa
ADD COLUMN idade INTEGER;
●
● No entanto, dependemos de dois arquivos de
entrada:
$ apgdiff --help
Usage: apgdiff [options] <old_dump> <new_dump>
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
17. PostgreSQL
Controle de versão
● Voltando um pouco ...
● Git trabalha com branches e podemos visualiza-los
através de git-branch:
$ git branch
* master
pessoa
salario
● E mudar de ramo com o comando checkout:
$ git checkout pessoa
master
* pessoa
salario
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
18. PostgreSQL
Gerenciamento de branches
● Arquivo modelo.sql
2 6
pessoa
m
ch
erg
n
b ra
e
1 4 7
master
b ra n c h
3 5 8
salario
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
19. PostgreSQL
Controle de versão
● É possível verificar diferenças entre dois
branches:
$ 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
);
… mas ainda assim não resolve
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
23. PostgreSQL
Interagindo com o banco
● Aplicar mudanças do branch no banco
$ git diff master pessoa | psql
ALTER TABLE
● Desfazer mudanças
$ git diff pessoa master | psql
ALTER TABLE
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
24. PostgreSQL
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)
);
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
25. PostgreSQL
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)
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br
26. PostgreSQL
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!
leo@postgresql.org.br
www.postgresql.org.br www.latinoware.org 2010 leo@postgresql.org.br