estripando o elefante - (trabalhando com extensões no postgresql)

84
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

Upload: dickson-s-guedes

Post on 27-May-2015

979 views

Category:

Documents


2 download

DESCRIPTION

Como estender o PostgreSQL... estripando sua aplicação e dividindo um problemão emproblemas menores utilizando extensões?

TRANSCRIPT

Page 1: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 2: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 3: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

ADVERTÊNCIA!

Page 4: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

ESTA PALESTRA POSSUI CONTEÚDO

QUE PODE QUEBRAR CERTOS

PARADÍGMAS SEUS

Page 5: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

“Quando você faz as coisas sempre do

mesmo jeito, obterá sempre os mesmos resultados” – Alguém

Page 6: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

No começo haviam vários bancos espalhados com várias funções...

Page 7: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

PostgreSQL 9.0+

PL/Perl+

Funções definidas pelo usuário

Page 8: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

… e então perdeu-se o controle.

Page 9: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

… 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

Page 10: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Como melhorar?

Page 11: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Primeiramente entendendo o problema...

Page 12: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Primeiramente entendendo o problema...

Pensando fora da caixa!

Page 13: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

PostgreSQL 9.1

PL/perl PL/pgsql SQL

pessoas usuarios

email_valido() cpf_valido()

Page 14: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

As aplicações precisavam ser modularizadas...

Page 15: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

As aplicações precisavam ser modularizadas...

… e o banco precisava ser atualizado

Page 16: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

As aplicações precisavam ser modularizadas...

… e o banco precisava ser atualizado

Page 17: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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● ...

Page 18: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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!

Page 19: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Tá! E como o PostgreSQL pode ajudar?

Page 20: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

EXTENSÕES

Page 21: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

EXTENSÕES

POR QUE?

Page 22: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Porque o PostgreSQL é

divertidamente estendível !

Page 23: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Por que o PostgreSQL é

divertidamente estendível ?

Page 24: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Por que o PostgreSQL é

divertidamente estendível ?

É guiado por catálogo!

Page 25: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Catálogo do sistema

Metadados

Dicionário de dados

Page 26: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Diferença para outros SGDBS?

Catálogo do sistema

Metadados

Dicionário de dados

Page 27: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Tabelas

Colunas

Tipos de dados

Funções

Domínios

Métodos de acesso

...

Page 28: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Tabelas

Colunas

Tipos de dados

Funções

Domínios

Métodos de acesso

...

Page 29: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

PostgreSQL não é apenas um

Sistema Gerenciador de Banco de Dados ...

Page 30: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

… ele é uma Plataforma de Desenvolvimento de

Aplicações

Page 31: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Você desenvolve bibliotecas de extensões reutilizáveis …

Page 32: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

… e as combina para criar aplicações!

Page 33: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Vamos começar!

Page 34: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 35: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Cadastro de pessoas

CREATE TABLE pessoas

(

nro_cpf cpf PRIMARY KEY,

nome text NOT NULL,

data_nascimento date

);

Page 36: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Cadastro de pessoas

CREATE TABLE pessoas

(

nro_cpf cpf PRIMARY KEY,

nome text NOT NULL,

data_nascimento date

);

Page 37: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 38: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 39: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 40: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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!

Page 41: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Cadastro de usuarios

CREATE TABLE usuarios (

login email PRIMARY KEY,

nro_cpf cpf REFERENCES pessoas(nro_cpf)

);

Page 42: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Cadastro de usuarios

CREATE TABLE usuarios (

login email PRIMARY KEY,

nro_cpf cpf REFERENCES pessoas(nro_cpf)

);

Page 43: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Um operador especial

CREATE OPERATOR #? (

LEFTARG = numeric,

PROCEDURE = cpf_valido

);

Page 44: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Um operador especial

CREATE OPERATOR #? (

LEFTARG = numeric,

PROCEDURE = cpf_valido

);

Page 45: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Um operador especial

CREATE OPERATOR @? (

LEFTARG = citext,

PROCEDURE = email_valido

);

Page 46: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Um operador especial

CREATE OPERATOR @? (

LEFTARG = citext,

PROCEDURE = email_valido

);

Page 47: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 48: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 49: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 50: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

PostgreSQL 9.1

PL/perl PL/pgsql

Validadores

email_valido() cpf_valido()

SQL

pessoas usuarios

Page 51: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Cara! Show me the code!

Page 52: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 53: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 54: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 55: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 56: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 57: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

# validadores extensioncomment = 'Extensao que contem validadores de CNPJ, CPF'default_version = '0.0.1'relocatable = true

Controlfile: validadores.control

Page 58: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

# 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

Page 59: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 60: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Testes?

Page 61: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Em banco?

Page 62: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 63: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 64: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Gostei! Quero compartilhar!

Page 65: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Como faço?

Page 66: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

PGXN!

Page 67: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

PGXN

Um índice central de extensões do PostgreSQL

+Documentação

+Pesquisa

+Fácil instalação

Page 68: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Obrigado

David E. Wheeler!(@theory)

Page 69: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

DEMO

Page 70: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

PGXN Client

sudo apt­get install python­pippip install pgxnclientpgxn –help

Ex. pgxn install resetsequence

Page 71: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Obrigado

Daniele Varrazzo!(@dvarrazzo)

Page 72: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

DEMO

Page 73: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

PGXN Utils

gem install pgxn_utilspgxn_utils help Ex. pgxn_utils skeleton teste

Page 74: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

DEMO

Page 75: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Então...

Page 76: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

Use extensões ao invés de scripts que criam

objetos órfãos

Page 77: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

O PostgreSQL vai saber que os objetos fazem

parte de um pacote e...

Page 78: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

… poderá removê-los com um simples:

DROP EXTENSION … ;

Page 79: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

pg_dump não vai fazer o dump de todos os

objetos da extensão

Page 80: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

O PostgreSQL não vai deixar você remover objetos individuais

Page 81: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 82: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

?

Page 83: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)

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

Page 84: Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)