Estripando o Elefante   Como estender o    PostgreSQL...  … estripando sua aplicação e dividindo            um problemão e...
Estripando o Elefante   Como estender o    PostgreSQL...  … estripando sua aplicação e dividindo            um problemão e...
ADVERTÊNCIA!
ESTA PALESTRA POSSUI CONTEÚDOQUE PODE QUEBRAR     CERTOS PARADÍGMAS SEUS
“Quando você faz as  coisas sempre domesmo jeito, obterá sempre os mesmos  resultados” – Alguém
No começo haviam vários bancosespalhados 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 manual         Não havia controle de versão         Falta de abstraç...
Como melhorar?
Primeiramente entendendo o        problema...
Primeiramente entendendo o         problema...Pensando fora da caixa!
pessoas                       usuarios     email_valido()          cpf_valido()PL/perl               PL/pgsql             ...
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 qua...
Até então não tinhamos....●   Versionamento de funções no banco●   Gerenciamento de contribs    ●     saber facilmente qua...
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
Catálogo do sistema             Metadados                      Dicionário de dadosDiferença para outros SGDBS?
TabelasColunas              Tipos de dados                                Funções   Domínios                          Méto...
TabelasColunas              Tipos de dados                                Funções   Domínios                          Méto...
PostgreSQL não é     apenas umSistema Gerenciadorde Banco de Dados ...
… ele é uma Plataformade 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.0           Varias tabelasVárias funções em varias linguagens         Código sem testes Pouco versionam...
Cadastro de pessoasCREATE TABLE pessoas(     nro_cpf   cpf   PRIMARY KEY,     nome      text NOT NULL,     data_nascimento...
Cadastro de pessoasCREATE TABLE pessoas(     nro_cpf   cpf   PRIMARY KEY,     nome      text NOT NULL,     data_nascimento...
Cadastro de pessoasINSERT INTO pessoas(nro_cpf, nome, data_nascimento)VALUES(88274557875, Adaloso Cachimbinho Lustrado, 19...
Cadastro de pessoasINSERT INTO pessoas(nro_cpf, nome, data_nascimento)VALUES(88274557875, Adaloso Cachimbinho Lustrado, 19...
Cadastro de pessoasINSERT INTO pessoas(nro_cpf, nome, data_nascimento)VALUES(88274557875, Adaloso Cachimbinho Lustrado, 19...
Cadastro de pessoasINSERT INTO pessoas(nro_cpf, nome, data_nascimento)VALUES(88274557875, Adaloso Cachimbinho Lustrado, 19...
Cadastro de usuariosCREATE TABLE usuarios (     login email PRIMARY KEY,    nro_cpf cpf REFERENCESpessoas(nro_cpf));
Cadastro de usuariosCREATE TABLE usuarios (     login email PRIMARY KEY,    nro_cpf cpf REFERENCESpessoas(nro_cpf));
Um operador especialCREATE OPERATOR #? (     LEFTARG   = numeric,     PROCEDURE = cpf_valido);
Um operador especialCREATE OPERATOR #? (     LEFTARG   = numeric,     PROCEDURE = cpf_valido);
Um operador especialCREATE OPERATOR @? (     LEFTARG = citext,     PROCEDURE = email_valido);
Um operador especialCREATE OPERATOR @? (     LEFTARG = citext,     PROCEDURE = email_valido);
Cadastro de usuariosINSERT INTO usuarios (login, nro_cpf)VALUES    (adaloso@cahimbinho.net, 88856899302),    (enelildo@cal...
Cadastro de usuariosINSERT INTO usuarios (login, nro_cpf)VALUES    (adaloso@cahimbinho.net, 88856899302),    (enelildo@cal...
Comportamento esperado●   SELECT cpf_valido(59328253241); -- true●   SELECT 59328253241 #?; -- true●   SELECT 91416000433 ...
pessoas                         usuarios                   Validadoresemail_valido()                        cpf_valido() P...
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 control...
Os passos●   Prepare o código fonte, os testes e a    documentação●   Crie o arquivo Makefile●   Crie o arquivo de control...
MakefileEXTENSION    = validadoresEXTVERSION   = $(shell grep default_version $(EXTENSION).control | sed -e"s/default_vers...
Makefileifeq ($(PG91),yes)all: sql/$(EXTENSION)--$(EXTVERSION).sqlsql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sq...
Os passos●   Prepare o código fonte, os testes e a    documentação●   Crie o arquivo Makefile●   Crie o arquivo de control...
Controlfile: validadores.control# validadores extensioncomment = Extensao que contem validadores de CNPJ, CPFdefault_versi...
Controlfile: validadores.control# validadores extensioncomment = Extensao que contem validadores de CNPJ, CPFdefault_versi...
Os passos●   Prepare o código fonte, os testes e a    documentação●   Crie o arquivo Makefile●   Crie o arquivo de control...
Testes?
Em banco?
Os passos●   Prepare o código fonte, os testes e a    documentação●   Crie o arquivo Makefile●   Crie o arquivo de control...
Os passos●   Prepare o código fonte, os testes e a    documentação●   Crie o arquivo Makefile●   Crie o arquivo de control...
Gostei! Quero compartilhar!
Como faço?
PGXN!
PGXNUm índice central de extensões do          PostgreSQL                 +         Documentação                 +        ...
ObrigadoDavid E. Wheeler!     (@theory)
DEMO
PGXN Clientsudo apt­get install python­pippip install pgxnclientpgxn –helpEx. pgxn install resetsequence
ObrigadoDaniele Varrazzo!     (@dvarrazzo)
DEMO
PGXN Utilsgem 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 fazemparte 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çãopara 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://ww...
Estripando o Elefante - (Trabalhando com extensões no PostgreSQL)
Próximos SlideShares
Carregando em…5
×

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

1.308 visualizações

Publicada em

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

0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.308
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
11
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. 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
  2. 2. 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
  3. 3. ADVERTÊNCIA!
  4. 4. ESTA PALESTRA POSSUI CONTEÚDOQUE PODE QUEBRAR CERTOS PARADÍGMAS SEUS
  5. 5. “Quando você faz as coisas sempre domesmo jeito, obterá sempre os mesmos resultados” – Alguém
  6. 6. No começo haviam vários bancosespalhados com várias funções...
  7. 7. PostgreSQL 9.0 + PL/Perl +Funções definidas pelo usuário
  8. 8. … e então perdeu-se o controle.
  9. 9. … e então perdeu-se o controle. Gerenciamento manual Não havia controle de versão Falta de abstração, e modularidade Sem reutilização de código
  10. 10. Como melhorar?
  11. 11. Primeiramente entendendo o problema...
  12. 12. Primeiramente entendendo o problema...Pensando fora da caixa!
  13. 13. pessoas usuarios email_valido() cpf_valido()PL/perl PL/pgsql SQL PostgreSQL 9.1
  14. 14. As aplicações precisavam ser modularizadas...
  15. 15. As aplicações precisavam ser modularizadas... … e o banco precisava ser atualizado
  16. 16. As aplicações precisavam ser modularizadas... … e o banco precisava ser atualizado
  17. 17. 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● ...
  18. 18. 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!
  19. 19. Tá! E como o PostgreSQL pode ajudar?
  20. 20. EXTENSÕES
  21. 21. EXTENSÕES POR QUE?
  22. 22. Porque o PostgreSQL édivertidamente estendível !
  23. 23. Por que o PostgreSQL édivertidamente estendível ?
  24. 24. Por que o PostgreSQL édivertidamente estendível ?É guiado por catálogo!
  25. 25. Catálogo do sistema Metadados Dicionário de dados
  26. 26. Catálogo do sistema Metadados Dicionário de dadosDiferença para outros SGDBS?
  27. 27. TabelasColunas Tipos de dados Funções Domínios Métodos de acesso ...
  28. 28. TabelasColunas Tipos de dados Funções Domínios Métodos de acesso ...
  29. 29. PostgreSQL não é apenas umSistema Gerenciadorde Banco de Dados ...
  30. 30. … ele é uma Plataformade Desenvolvimento de Aplicações
  31. 31. Você desenvolve bibliotecas de extensões reutilizáveis …
  32. 32. … e as combina para criar aplicações!
  33. 33. Vamos começar!
  34. 34. Banco PostgreSQL 9.0 Varias tabelasVárias funções em varias linguagens Código sem testes Pouco versionamento das funcoesO dump possui o codigo das funcoesGerenciamento atraves de esquemas
  35. 35. Cadastro de pessoasCREATE TABLE pessoas( nro_cpf cpf PRIMARY KEY, nome text NOT NULL, data_nascimento date);
  36. 36. Cadastro de pessoasCREATE TABLE pessoas( nro_cpf cpf PRIMARY KEY, nome text NOT NULL, data_nascimento date);
  37. 37. Cadastro de pessoasINSERT 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);
  38. 38. Cadastro de pessoasINSERT 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);
  39. 39. Cadastro de pessoasINSERT 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)
  40. 40. Cadastro de pessoasINSERT 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 VIOLATION!(12312312300, Ester Lionata Rio, 1981-04-22)
  41. 41. Cadastro de usuariosCREATE TABLE usuarios ( login email PRIMARY KEY, nro_cpf cpf REFERENCESpessoas(nro_cpf));
  42. 42. Cadastro de usuariosCREATE TABLE usuarios ( login email PRIMARY KEY, nro_cpf cpf REFERENCESpessoas(nro_cpf));
  43. 43. Um operador especialCREATE OPERATOR #? ( LEFTARG = numeric, PROCEDURE = cpf_valido);
  44. 44. Um operador especialCREATE OPERATOR #? ( LEFTARG = numeric, PROCEDURE = cpf_valido);
  45. 45. Um operador especialCREATE OPERATOR @? ( LEFTARG = citext, PROCEDURE = email_valido);
  46. 46. Um operador especialCREATE OPERATOR @? ( LEFTARG = citext, PROCEDURE = email_valido);
  47. 47. Cadastro de usuariosINSERT 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);
  48. 48. Cadastro de usuariosINSERT 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);
  49. 49. 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
  50. 50. pessoas usuarios Validadoresemail_valido() cpf_valido() PL/perl PL/pgsql SQL PostgreSQL 9.1
  51. 51. Cara! Show me the code!
  52. 52. 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
  53. 53. 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
  54. 54. MakefileEXTENSION = 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)
  55. 55. Makefileifeq ($(PG91),yes)all: sql/$(EXTENSION)--$(EXTVERSION).sqlsql/$(EXTENSION)--$(EXTVERSION).sql: sql/$(EXTENSION).sql cp $< $@DATA = $(wildcard sql/*--*.sql) sql/$(EXTENSION)--$(EXTVERSION).sqlEXTRA_CLEAN = sql/$(EXTENSION)--$(EXTVERSION).sqlendifPGXS := $(shell $(PG_CONFIG) --pgxs)include $(PGXS)
  56. 56. 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
  57. 57. Controlfile: validadores.control# validadores extensioncomment = Extensao que contem validadores de CNPJ, CPFdefault_version = 0.0.1relocatable = true
  58. 58. Controlfile: validadores.control# validadores extensioncomment = Extensao que contem validadores de CNPJ, CPFdefault_version = 0.0.1relocatable = trueLearn more ...http://www.postgresql.org/docs/current/static/extend-extensions.html#AEN51780
  59. 59. 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
  60. 60. Testes?
  61. 61. Em banco?
  62. 62. 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
  63. 63. 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
  64. 64. Gostei! Quero compartilhar!
  65. 65. Como faço?
  66. 66. PGXN!
  67. 67. PGXNUm índice central de extensões do PostgreSQL + Documentação + Pesquisa + Fácil instalação
  68. 68. ObrigadoDavid E. Wheeler! (@theory)
  69. 69. DEMO
  70. 70. PGXN Clientsudo apt­get install python­pippip install pgxnclientpgxn –helpEx. pgxn install resetsequence
  71. 71. ObrigadoDaniele Varrazzo! (@dvarrazzo)
  72. 72. DEMO
  73. 73. PGXN Utilsgem install pgxn_utilspgxn_utils help Ex. pgxn_utils skeleton teste
  74. 74. DEMO
  75. 75. Então...
  76. 76. Use extensões ao invés de scripts que criam objetos órfãos
  77. 77. O PostgreSQL vai saber que os objetos fazemparte de um pacote e...
  78. 78. … poderá removê-los com um simples:DROP EXTENSION … ;
  79. 79. pg_dump não vai fazer o dump de todos os objetos da extensão
  80. 80. O PostgreSQL não vai deixar você remover objetos individuais
  81. 81. Scripts de modificaçãopara upgrade de versão extensao--1.0.0--1.0.1.sql ALTER EXTENSION extensao UPDATE TO 1.0.1;
  82. 82. ?
  83. 83. 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

×