versionamento de modelo de dados com postgresql

26
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

Upload: leonardo-cezar

Post on 05-Jul-2015

684 views

Category:

Technology


20 download

TRANSCRIPT

Page 1: Versionamento de modelo de dados com PostgreSQL

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

Page 2: Versionamento de modelo de dados com PostgreSQL

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

Page 3: Versionamento de modelo de dados com PostgreSQL

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

Page 4: Versionamento de modelo de dados com PostgreSQL

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 [, ... ]

Page 5: Versionamento de modelo de dados com PostgreSQL

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

Page 6: Versionamento de modelo de dados com PostgreSQL

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

Page 7: Versionamento de modelo de dados com PostgreSQL

PostgreSQL

www.postgresql.org.br [email protected] 2010

● Ferramentas● Subversion● CVS (ugh!)● Bazaar● Mercurial● Git● Codeville● Arch● [...]

Controle de versãoControle de versão

Page 8: Versionamento de modelo de dados com PostgreSQL

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

Page 9: Versionamento de modelo de dados com PostgreSQL

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

Page 10: Versionamento de modelo de dados com PostgreSQL

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

Page 11: Versionamento de modelo de dados com PostgreSQL

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

Page 12: Versionamento de modelo de dados com PostgreSQL

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

Page 13: Versionamento de modelo de dados com PostgreSQL

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

Page 14: Versionamento de modelo de dados com PostgreSQL

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

Page 15: Versionamento de modelo de dados com PostgreSQL

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

Page 16: Versionamento de modelo de dados com PostgreSQL

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

Page 17: Versionamento de modelo de dados com PostgreSQL

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

Page 18: Versionamento de modelo de dados com PostgreSQL

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

Page 19: Versionamento de modelo de dados com PostgreSQL

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

Page 20: Versionamento de modelo de dados com PostgreSQL

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

Page 21: Versionamento de modelo de dados com PostgreSQL

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;

Page 22: Versionamento de modelo de dados com PostgreSQL

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) );

Page 23: Versionamento de modelo de dados com PostgreSQL

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

Page 24: Versionamento de modelo de dados com PostgreSQL

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));

Page 25: Versionamento de modelo de dados com PostgreSQL

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)

Page 26: Versionamento de modelo de dados com PostgreSQL

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]