Upload
dickson-s-guedes
View
979
Download
2
Embed Size (px)
DESCRIPTION
Como estender o PostgreSQL... estripando sua aplicação e dividindo um problemão emproblemas menores utilizando extensões?
Citation preview
Estripando o Elefante
Como estender o PostgreSQL...
… estripando sua aplicação e dividindo um problemão em
problemas menores utilizando extensões?
por Dickson S. Guedes (@guediz)
PGBR 2011, 4 de Novembro
Estripando o Elefante
Como estender o PostgreSQL...
… estripando sua aplicação e dividindo um problemão em
problemas menores utilizando extensões?
por Dickson S. Guedes (@guediz)
PGBR 2011, 4 de Novembro
ADVERTÊNCIA!
ESTA PALESTRA POSSUI CONTEÚDO
QUE PODE QUEBRAR CERTOS
PARADÍGMAS SEUS
“Quando você faz as coisas sempre do
mesmo jeito, obterá sempre os mesmos resultados” – Alguém
No começo haviam vários bancos espalhados com várias funções...
PostgreSQL 9.0+
PL/Perl+
Funções definidas pelo usuário
… e então perdeu-se o controle.
… e então perdeu-se o controle.
Gerenciamento manualNão havia controle de versãoFalta de abstração, e modularidadeSem reutilização de código
Como melhorar?
Primeiramente entendendo o problema...
Primeiramente entendendo o problema...
Pensando fora da caixa!
PostgreSQL 9.1
PL/perl PL/pgsql SQL
pessoas usuarios
email_valido() cpf_valido()
As aplicações precisavam ser modularizadas...
As aplicações precisavam ser modularizadas...
… e o banco precisava ser atualizado
As aplicações precisavam ser modularizadas...
… e o banco precisava ser atualizado
Até então não tinhamos....
● Versionamento de funções no banco● Gerenciamento de contribs
● saber facilmente quais contribs estão instaladas, por exemplo
● Modularidade● Reaproveitamento de código● Contribuições para comunidade● ...
Até então não tinhamos....
● Versionamento de funções no banco● Gerenciamento de contribs
● saber facilmente quais contribs estão instaladas, por exemplo
● Modularidade● Reaproveitamento de código● Contribuições para comunidade● ...
SIM! Eu consigo dividir para conquistar!
Tá! E como o PostgreSQL pode ajudar?
EXTENSÕES
EXTENSÕES
POR QUE?
Porque o PostgreSQL é
divertidamente estendível !
Por que o PostgreSQL é
divertidamente estendível ?
Por que o PostgreSQL é
divertidamente estendível ?
É guiado por catálogo!
Catálogo do sistema
Metadados
Dicionário de dados
Diferença para outros SGDBS?
Catálogo do sistema
Metadados
Dicionário de dados
Tabelas
Colunas
Tipos de dados
Funções
Domínios
Métodos de acesso
...
Tabelas
Colunas
Tipos de dados
Funções
Domínios
Métodos de acesso
...
PostgreSQL não é apenas um
Sistema Gerenciador de Banco de Dados ...
… ele é uma Plataforma de Desenvolvimento de
Aplicações
Você desenvolve bibliotecas de extensões reutilizáveis …
… e as combina para criar aplicações!
Vamos começar!
Banco PostgreSQL 9.0Varias tabelas
Várias funções em varias linguagensCódigo sem testes
Pouco versionamento das funcoesO dump possui o codigo das funcoesGerenciamento atraves de esquemas
Cadastro de pessoas
CREATE TABLE pessoas
(
nro_cpf cpf PRIMARY KEY,
nome text NOT NULL,
data_nascimento date
);
Cadastro de pessoas
CREATE TABLE pessoas
(
nro_cpf cpf PRIMARY KEY,
nome text NOT NULL,
data_nascimento date
);
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),(96672786465, 'Enelildo Protolino Calado' , '1983-02-13'),(88856899302, 'Feicebuque Ailaique' , '1976-07-06'),(12563330858, 'Torrecilda Tapelia' , '1987-11-16'),(27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'),(25616561282, 'Uessebelson Blutuf' , '1983-05-11');
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),(96672786465, 'Enelildo Protolino Calado' , '1983-02-13'),(88856899302, 'Feicebuque Ailaique' , '1976-07-06'),(12563330858, 'Torrecilda Tapelia' , '1987-11-16'),(27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'),(25616561282, 'Uessebelson Blutuf' , '1983-05-11');
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),(96672786465, 'Enelildo Protolino Calado' , '1983-02-13'),(88856899302, 'Feicebuque Ailaique' , '1976-07-06'),(12563330858, 'Torrecilda Tapelia' , '1987-11-16'),(27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'),(25616561282, 'Uessebelson Blutuf' , '1983-05-11');
Mas...
INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (12312312300, 'Ester Lionata Rio', '1981-04-22')
Cadastro de pessoas
INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (88274557875, 'Adaloso Cachimbinho Lustrado', '1981-04-22'),(96672786465, 'Enelildo Protolino Calado' , '1983-02-13'),(88856899302, 'Feicebuque Ailaique' , '1976-07-06'),(12563330858, 'Torrecilda Tapelia' , '1987-11-16'),(27837882334, 'Almofafio Vasildo Tomado' , '1965-01-08'),(25616561282, 'Uessebelson Blutuf' , '1983-05-11');
Mas...
INSERT INTO pessoas(nro_cpf, nome, data_nascimento) VALUES (12312312300, 'Ester Lionata Rio', '1981-04-22')
VIOLATION!
Cadastro de usuarios
CREATE TABLE usuarios (
login email PRIMARY KEY,
nro_cpf cpf REFERENCES pessoas(nro_cpf)
);
Cadastro de usuarios
CREATE TABLE usuarios (
login email PRIMARY KEY,
nro_cpf cpf REFERENCES pessoas(nro_cpf)
);
Um operador especial
CREATE OPERATOR #? (
LEFTARG = numeric,
PROCEDURE = cpf_valido
);
Um operador especial
CREATE OPERATOR #? (
LEFTARG = numeric,
PROCEDURE = cpf_valido
);
Um operador especial
CREATE OPERATOR @? (
LEFTARG = citext,
PROCEDURE = email_valido
);
Um operador especial
CREATE OPERATOR @? (
LEFTARG = citext,
PROCEDURE = email_valido
);
Cadastro de usuarios
INSERT INTO usuarios (login, nro_cpf)
VALUES
('[email protected]', 88856899302),
('[email protected]', 96672786465),
('[email protected]', 88856899302),
('[email protected]', 12563330858),
('[email protected]', 27837882334),
('[email protected]', 25616561282);
Cadastro de usuarios
INSERT INTO usuarios (login, nro_cpf)
VALUES
('[email protected]', 88856899302),
('[email protected]', 96672786465),
('[email protected]', 88856899302),
('[email protected]', 12563330858),
('[email protected]', 27837882334),
('[email protected]', 25616561282);
Comportamento esperado
● SELECT cpf_valido(59328253241); -- true● SELECT 59328253241 #?; -- true● SELECT 91416000433 #?; -- false● SELECT NOT 37821042003 #?; -- true● SELECT email_valido('xpto@net'); -- false● SELECT email_valido('[email protected]'); -- true● SELECT 'rotime@net' @? ; -- false● SELECT '[email protected]' @? ; -- true
PostgreSQL 9.1
PL/perl PL/pgsql
Validadores
email_valido() cpf_valido()
SQL
pessoas usuarios
Cara! Show me the code!
Os passos
● Prepare o código fonte, os testes e a documentação
● Crie o arquivo Makefile● Crie o arquivo de controle● Escreva testes● Escreva o código● Documente
Os passos
● Prepare o código fonte, os testes e a documentação
● Crie o arquivo Makefile● Crie o arquivo de controle● Escreva testes● Escreva o código● Documente
EXTENSION = validadoresEXTVERSION = $(shell grep default_version $(EXTENSION).control | sed -e "s/default_version[[:space:]]*=[[:space:]]*'\([^']*\)'/\1/")
DATA = $(filter-out $(wildcard sql/*--*.sql),$(wildcard sql/*.sql))DOCS = $(wildcard doc/*.md)TESTS = $(wildcard test/sql/*.sql)REGRESS = $(patsubst test/sql/%.sql,%,$(TESTS))REGRESS_OPTS = --inputdir=test --load-language=plpgsql#Descomente esta linha caso tenha funções em C#MODULES = $(patsubst %.c,%,$(wildcard src/*.c))PG_CONFIG = pg_configPG91 = $(shell $(PG_CONFIG) --version | grep -qE " 8\.| 9\.0" && echo no || echo yes)
Makefile
ifeq ($(PG91),yes)all: sql/$(EXTENSION)--$(EXTVERSION).sql
sql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sqlcp $< $@
DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$(EXTVERSION).sqlEXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sqlendif
PGXS := $(shell $(PG_CONFIG) --pgxs)include $(PGXS)
Makefile
Os passos
● Prepare o código fonte, os testes e a documentação
● Crie o arquivo Makefile● Crie o arquivo de controle● Escreva testes● Escreva o código● Documente
# validadores extensioncomment = 'Extensao que contem validadores de CNPJ, CPF'default_version = '0.0.1'relocatable = true
Controlfile: validadores.control
# validadores extensioncomment = 'Extensao que contem validadores de CNPJ, CPF'default_version = '0.0.1'relocatable = true
Learn more ...
http://www.postgresql.org/docs/current/static/extend-extensions.html#AEN51780
Controlfile: validadores.control
Os passos
● Prepare o código fonte, os testes e a documentação
● Crie o arquivo Makefile● Crie o arquivo de controle● Escreva testes● Escreva o código● Documente
Testes?
Em banco?
Os passos
● Prepare o código fonte, os testes e a documentação
● Crie o arquivo Makefile● Crie o arquivo de controle● Escreva testes● Escreva o código● Documente
Os passos
● Prepare o código fonte, os testes e a documentação
● Crie o arquivo Makefile● Crie o arquivo de controle● Escreva testes● Escreva o código● Documente
Gostei! Quero compartilhar!
Como faço?
PGXN!
PGXN
Um índice central de extensões do PostgreSQL
+Documentação
+Pesquisa
+Fácil instalação
Obrigado
David E. Wheeler!(@theory)
DEMO
PGXN Client
sudo aptget install pythonpippip install pgxnclientpgxn –help
Ex. pgxn install resetsequence
Obrigado
Daniele Varrazzo!(@dvarrazzo)
DEMO
PGXN Utils
gem install pgxn_utilspgxn_utils help Ex. pgxn_utils skeleton teste
DEMO
Então...
Use extensões ao invés de scripts que criam
objetos órfãos
O PostgreSQL vai saber que os objetos fazem
parte de um pacote e...
… poderá removê-los com um simples:
DROP EXTENSION … ;
pg_dump não vai fazer o dump de todos os
objetos da extensão
O PostgreSQL não vai deixar você remover objetos individuais
Scripts de modificação para upgrade de versão
extensao--1.0.0--1.0.1.sql
ALTER EXTENSION extensao UPDATE TO '1.0.1';
?
Referências
● WEB● http://pgxn.org
● http://blog.pgxn.org
● http://www.postgresql.org.br
● http://www.postgresql.org
● IRC● irc.freenode.net
– Guedes @ #postgresql, #postgresql-br
● Gtalk● [email protected]
● Twitter● @pgxn
● @guediz
● @pgcasts