Top Banner
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
26

Versionamento de modelo de dados com PostgreSQL

Jul 05, 2015

Download

Technology

Leonardo Cezar
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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]