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

Preview:

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

('adaloso@cahimbinho.net', 88856899302),

('enelildo@calado.com', 96672786465),

('feicebuque.ailaique@facebook.com', 88856899302),

('tata.torre87@hotmail.com', 12563330858),

('tomado35@gmail.com', 27837882334),

('usb.83@aasdasdasd.com', 25616561282);

Cadastro de usuarios

INSERT INTO usuarios (login, nro_cpf)

VALUES

('adaloso@cahimbinho.net', 88856899302),

('enelildo@calado.com', 96672786465),

('feicebuque.ailaique@facebook.com', 88856899302),

('tata.torre87@hotmail.com', 12563330858),

('tomado35@gmail.com', 27837882334),

('usb.83@aasdasdasd.com', 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('xpto@hotmail.com'); -- true● SELECT 'rotime@net' @? ; -- false● SELECT 'feice@book.net' @? ; -- 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 apt­get install python­pippip 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● guedes@guedesoft.net

● Twitter● @pgxn

● @guediz

● @pgcasts