XML-RPC + Python + Banco de Dados - Fernando Massen
1. XML-RPC + Python + Banco de Dados
Fernando Massen
15 de novembro de 2006
1 / 33
2. Introdu¸˜o
ca
Fernando
Objetivos
Python
XML
XML-RPC
SQL
Motiva¸˜o
ca
Ponte com o Banco
de Dados Introdu¸˜o
ca
Proposta de
Gram´tica XML
a
para SQL
XML-RPC
Mais informa¸oes
c˜
2 / 33
3. Fernando
Introdu¸˜o
ca
Fernando
s Desenvolvo software para backend corporativo
Objetivos s Tem um pouco de tudo, inclusive Python
Python
XML
s Desde o Python 1.5, por´m usando de verdade a partir do
e
XML-RPC 2.1
SQL
s Principalmente para tarefas onde o tempo ´ crucial
e
Motiva¸˜o
ca
Ponte com o Banco
s Obviamente tamb´m por causa da facilidade
e
de Dados
Proposta de
Gram´tica XML
a
para SQL
XML-RPC
Mais informa¸oes
c˜
3 / 33
4. Objetivos
Introdu¸˜o
ca
Fernando
s Demonstrar o protocolo XML-RPC do ponto de vista do
Objetivos desenvolvedor de aplica¸˜es.
co
Python
XML
s Mostrar a facilidade de programa¸˜o em Python.
ca
XML-RPC s Fornecer novas id´ias para desenvolvimento utilizando uma
e
SQL
linguagem-ponte unica entre bancos de dados.
´
Motiva¸˜o
ca
Ponte com o Banco
s Juntar tudo isto: Python, SQL, XML e RPC.
de Dados s Distribuir um pequeno c´digo-exemplo que demonstra estes
o
Proposta de
Gram´tica XML
a acrˆnimos juntos.
o
para SQL
s Se der tempo, demonstrar parte do c´digo.
o
XML-RPC
Mais informa¸oes
c˜
4 / 33
5. Python
Introdu¸˜o
ca
Fernando
Mesmo que eu esteja apenas rezando para o clero, n˜o custa
a
Objetivos citar algumas virtudes do Python:
Python
XML s Uma linguagem absurdamente f´cil de aprender
a
XML-RPC
SQL s Tem uma implementa¸˜o de Orienta¸˜o a Objeto
ca ca
Motiva¸˜o
ca desburocratizada, apesar de incompleta
Ponte com o Banco s ´
E software livre – um grande diferencial em ambientes
de Dados
Proposta de corporativos
Gram´tica XML
a
para SQL
s Roda em mais plataformas do que Java (pelo menos a
XML-RPC implementa¸˜o da Sun)
ca
Mais informa¸oes
c˜ s ´ a
E f´cil de estender (criar novos m´dulos)
o
s Vem com um mundo de funcionalidades j´ inclu´
a ıdo
5 / 33
6. XML
Introdu¸˜o
ca
Fernando
´
E aquele encoding de texto que todo mundo conhece.
Objetivos
Python s Apesar de repetitivo, ´ de f´cil entendimento para os seres
e a
XML
XML-RPC
humanos.
SQL s A complexidade fica nas aplica¸oes, j´ que a mensagem n˜o
c˜ a a
Motiva¸˜o
ca cont´m inteligˆncia.
e e
Ponte com o Banco
de Dados
s Se utilizado um encoding de texto como UTF-8, deriva numa
Proposta de mensagem praticamente universal.
Gram´tica XML
a
para SQL s Pode significar qualquer coisa (ao mesmo tempo que n˜o a
XML-RPC especifica o que significa).
Mais informa¸oes
c˜ s Apesar de suas desvantagens, sabemos que vai ficar.
6 / 33
7. XML-RPC
Introdu¸˜o
ca
Fernando
´
E o meio de transporte escolhido para demonstrar a id´ia.
e
Objetivos
Python s Poderia ter implementado esta ponte com sockets. Sim, mas:
XML
XML-RPC x Demoraria mais para implementar. Isto tem que ser f´cil!
a
SQL
Motiva¸˜o
ca
Ponte com o Banco
x N˜o ´ necess´rio mudar os designs de boa parte do
a e a
de Dados c´digo ao trocar o transporte.
o
Proposta de
Gram´tica XML
a x Teria que cuidar de v´rios aspectos que o XML-RPC faz
a
para SQL
sozinho.
XML-RPC
Mais informa¸oes
c˜ s ´
E um meio de transporte estupidamente f´cil de se
a
implementar.
s ´
E simples. Essa simplicidade tem a cara do Python.
7 / 33
8. SQL
Introdu¸˜o
ca
Fernando
Indispens´vel:
a
Objetivos ´
s E uma linguagem funcional para manipula¸˜o de bancos de
ca
Python
XML dados.
XML-RPC
SQL
´
s E um padr˜o de facto.
a
Motiva¸˜o
ca s Possui certas incompatibilidades entre fornecedores, mas as
Ponte com o Banco diferen¸as s˜o contorn´veis atrav´s da aderˆncia de padr˜es
c a a e e o
de Dados
Proposta de (SQL92, SQL99, etc.) e de interfaces universalizadas (como
Gram´tica XML
a
para SQL
esta!)
XML-RPC s Ainda n˜o d´ para abandonar os bancos de dados relacionais
a a
Mais informa¸oes
c˜ para utilizar somente a orienta¸˜o a objeto:
ca
x Acaba-se criando pontes OO-relacionais.
x Ocorre convers˜o de dados entre v´rios tipos diversos.
a a
x BDs relacionais simplesmente funcionam! Est˜o a´
a ı
implementados h´ mais d´cadas, inclusive, que a pr´pria
a e o
OO.
8 / 33
9. Introdu¸˜o
ca
Motiva¸˜o
ca
Uma interface unica
´
com Bancos de
Dados
N˜o h´ gram´ticas
a a a
XML para SQL no
W3C!
SQL tem a cara do
XML!
Ponte com o Banco
de Dados
Motiva¸˜o
ca
Proposta de
Gram´tica XML
a
para SQL
XML-RPC
Mais informa¸oes
c˜
9 / 33
10. Uma interface unica com Bancos de Dados
´
Introdu¸˜o
ca
s Criar especifica¸˜es para cada banco de dados ´ uma tarefa
co e
Motiva¸˜o
ca
Uma interface unica
´
penosa.
com Bancos de
Dados
s Gerenciar as diferen¸as entre os engines no c´digo s´ com
c o o
N˜o h´ gram´ticas
a a a
XML para SQL no
SQL ´ um trabalho de S´
e ısifo.
W3C!
SQL tem a cara do
s Mesmo assim, configurar acesso a banco de dados ´ de certa
e
XML! forma complicado, e mudar isso mesmo que em
Ponte com o Banco
de Dados desenvolvimento gera tempo.
Proposta de
Gram´tica XML
a
s Manter SQL manualmente d´ chance a erros Hom´ricos.
a e
para SQL s O formato dos dados retornados ´ sempre peculiar a cada
e
XML-RPC linguagem. Tendo uma s´ maneira de retornar os dados
o
Mais informa¸oes
c˜
permite que haja uma independˆncia total da
e
linguagem-cliente.
10 / 33
11. N˜o h´ gram´ticas XML para SQL no W3C!
a a a
Introdu¸˜o
ca
s No W3C, vive-se num tempo p´s-moderno em termos de
o
Motiva¸˜o
ca
Uma interface unica
´
programa¸˜o: os sistemas teoricamente n˜o possuem legado,
ca a
com Bancos de
Dados
tudo ´ tratado com mais e mais gram´ticas XML, movidas a
e a
N˜o h´ gram´ticas
a a a
XML para SQL no
Web Semˆntica.
a
W3C!
SQL tem a cara do
s XML serviria para trocas entre dados, n˜o para
a
XML! processamento interno.
Ponte com o Banco
de Dados s Seria interessante como API de manipula¸˜o; n˜o ´ ` toa
ca a ea
Proposta de
Gram´tica XML
a
que criaram-se facilidades como XML-RPC, SOAP, WSDL...
para SQL s Um grande potencial de processamento remoto e distribu´ıdo
XML-RPC n˜o est´ sendo utilizado.
a a
Mais informa¸oes
c˜
s O ideal seria reescrever o SQL em XML, e “for¸ar” os
c
fabricantes a adotar este padr˜o (utopias mil!)
a
s Menos inconsistˆncias, menos retrabalho – hoje n˜o h´
e a a
nenhuma vantagem inerente no SQL para fazer um Banco de
Dados vender mais do que o outro.
11 / 33
12. SQL tem a cara do XML!
Introdu¸˜o
ca
s O SQL foi criado numa ´poca sem as possibilidades e
e
Motiva¸˜o
ca
Uma interface unica
´
padr˜es da Web.
o
com Bancos de
Dados
s Provavelmente, se fosse criado hoje, adotaria uma gram´tica
a
N˜o h´ gram´ticas
a a a
XML para SQL no
XML.
W3C! s ´
E poss´ que seja ainda mais odiado.
ıvel
SQL tem a cara do
XML! s Possibilidades interessantes para os fabricantes poderiam ter
Ponte com o Banco
de Dados surgido: criar queries com “desenhistas de XML”, ou
Proposta de
Gram´tica XML
a
derivando tabelas diretamente de nota¸oes como UML.
c˜
para SQL s Para o sistema que vocˆ esteja criando, a quest˜o do banco
e a
XML-RPC de dados torna-se irrelevante.
Mais informa¸oes
c˜
12 / 33
13. Introdu¸˜o
ca
Motiva¸˜o
ca
Ponte com o Banco
de Dados
Escolhi o
PostgreSQL
C´digo de conex˜o
o a
com BD
Proposta de
Gram´tica XML
a
para SQL Ponte com o Banco de Dados
XML-RPC
Mais informa¸oes
c˜
13 / 33
14. Escolhi o PostgreSQL
Introdu¸˜o
ca
s Neste ponto utiliza-se um driver normal de banco de dados.
Motiva¸˜o
ca
Escolhi um (pyPgSQL) que ´ bastante popular.
e
Ponte com o Banco
de Dados s Tenha em mente que coisas como triggers, views e coisas do
Escolhi o
PostgreSQL gˆnero s˜o inerentes a cada banco de dados.
e a
C´digo de conex˜o
o a
com BD s A manuten¸˜o do banco de dados n˜o ´ abordada pela
ca a e
Proposta de apresenta¸˜o. Imagino que o bom administrador saiba
ca
Gram´tica XML
a
para SQL administrar seu banco de dados e tenha interfaces
XML-RPC apropriadas para o mesmo.
Mais informa¸oes
c˜
s Nada impediria de extender a “gram´tica” XML para a
a
administra¸˜o do pr´prio BD; por´m a´ ´ que moram as
ca o e ıe
maiores incompatibilidades entre os BDs e, portanto, os
maiores problemas.
s Com o nosso exemplo de c´digo, bastaria adaptar duas ou
o
trˆs fun¸˜es `s sa´
e co a ıdas de drivers Python, e estaria pronto um
novo “driver”.
14 / 33
15. C´digo de conex˜o com BD
o a
Introdu¸˜o
ca
Usando pyPgSQL:
Motiva¸˜o
ca
Ponte com o Banco from pyPgSQL import libpq
de Dados dbconn = libpq.PQconnectdb("host=dbserver
Escolhi o
PostgreSQL dbname=python user=pguser")
C´digo de conex˜o
o a ret = dbconn.query(sqlstream)
com BD
# ret ´ um objeto estilo ‘‘Resultset’’,
e
Proposta de
Gram´tica XML
a # com v´rias propriedades
a
para SQL
# se acontecer um erro, acontece antes disso
XML-RPC
Mais informa¸oes
c˜
15 / 33
16. Introdu¸˜o
ca
Motiva¸˜o
ca
Ponte com o Banco
de Dados
Proposta de
Gram´tica XML
a
para SQL
Limita¸oes
c˜
Tipos de Dados
Recomend´veis
a
SELECT: exemplo
Proposta de Gram´tica XML para SQL
a
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informa¸oes
c˜
16 / 33
17. Limita¸˜es
co
Introdu¸˜o
ca
s O XML aceita qualquer nota¸˜o; o que equivaleria a
ca
Motiva¸˜o
ca
qualquer tipo de dados.
Ponte com o Banco
de Dados s O SQL n˜o – isso depende do fornecedor.
a
Proposta de
Gram´tica XML
a
s Pelo menos alguns tipos de dados s˜o comuns entre os
a
para SQL fornecedores de BD; ent˜o nivela-se por baixo: temos
a
Limita¸oes
c˜
Tipos de Dados n´meros inteiros, inteiros longos, n´meros decimais, datas,
u u
Recomend´veis
a
SELECT: exemplo booleanos e strings.
SELECT: resultado s As datas podem ser representadas como inteiros longos,
INSERT
UPDATE baseados no conceito de epoch.
DELETE
s As implementa¸˜es de booleano variam largamente. Uma
co
XML-RPC
conven¸˜o ´ necess´ria: sugiro 0 para falso e qualquer outro
ca e a
Mais informa¸oes
c˜
valor para verdadeiro.
s Os exemplos a seguir s˜o uma proposta do que ´ poss´
a e ıvel.
17 / 33
18. Tipos de Dados Recomend´veis
a
Introdu¸˜o
ca
Praticamente todos os bancos de dados suportam, de alguma
Motiva¸˜o
ca
forma, estes tipos de dados:
Ponte com o Banco
de Dados
s int
Proposta de
Gram´tica XML
a s long
para SQL
Limita¸oes
c˜ s string
Tipos de Dados
Recomend´veis
a s dec
SELECT: exemplo s bool
SELECT: resultado
INSERT
UPDATE
O restante s˜o especializa¸˜es que n˜o s˜o comuns ` grande
a co a a a
DELETE maioria de aplica¸˜es existentes.
co
XML-RPC
Mais informa¸oes
c˜
18 / 33
19. SELECT: exemplo
Introdu¸˜o
ca
<select>
Motiva¸˜o
ca
<fields>
Ponte com o Banco
de Dados <field name="clientes.id" />
Proposta de <field name="clientes.nome" />
Gram´tica XML
a <field name="clientes.nascimento" />
para SQL
Limita¸oes
c˜ <field name="endereco.nome" as="endereco" />
Tipos de Dados </fields>
Recomend´veis
a
SELECT: exemplo
<froms>
SELECT: resultado <table name="clientes">
INSERT <inner_join table="enderecos"
UPDATE
on="clientes.endereco=enderecos.id" />
DELETE
</table>
XML-RPC
</froms>
Mais informa¸oes
c˜ <wheres>
<eq field="clientes.id"><int>3</int></eq>
</wheres>
</select>
19 / 33
20. SELECT: resultado
Introdu¸˜o
ca
Esta ´ uma proposi¸˜o de sa´ a esta query.
e ca ıda
Motiva¸˜o
ca
Ponte com o Banco <result>
de Dados <row>
Proposta de <id><int>50</int></id>
Gram´tica XML
a
para SQL <nome><string>Jo~o da Esquina</string></nome>
a
Limita¸oes
c˜ <nascimento>
Tipos de Dados
Recomend´veis
a <variant>18/11/1980</variant>
SELECT: exemplo </nascimento>
SELECT: resultado <endereco><string>Rua sem N´mero</string></endereco>
u
INSERT
UPDATE
</row>
DELETE </result>
XML-RPC
Mais informa¸oes
c˜
20 / 33
21. INSERT
Introdu¸˜o
ca
<insert into="clientes">
Motiva¸˜o
ca
<field name="id"><int>10</int></field>
Ponte com o Banco
de Dados <field name="nome"><string>Jo~o da Costa</string></field>
a
Proposta de </insert>
Gram´tica XML
a
para SQL
Limita¸oes
c˜ Ou ent˜o um INSERT com um SELECT dentro:
a
Tipos de Dados
Recomend´veis
a
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informa¸oes
c˜
21 / 33
22. INSERT (cont.)
Introdu¸˜o
ca
<insert into="clientes">
Motiva¸˜o
ca
<fields>
Ponte com o Banco
de Dados <field name="id" />
Proposta de <field name="nome" />
Gram´tica XML
a </fields>
para SQL
Limita¸oes
c˜ <select>
Tipos de Dados <fields>
Recomend´veis
a
SELECT: exemplo
<field name="id" />
SELECT: resultado <field name="nome" />
INSERT </fields>
UPDATE
<froms>
DELETE
<table name="clientes" />
XML-RPC
</froms>
Mais informa¸oes
c˜ <wheres>
<eq field="id"><int>15</int></eq>
</wheres>
</select>
</insert>
22 / 33
23. UPDATE
Introdu¸˜o
ca
<update table="clientes">
Motiva¸˜o
ca
<fields>
Ponte com o Banco
de Dados <field name="name"><string>Joao da Costa
Proposta de Netto</string></field>
Gram´tica XML
a </fields>
para SQL
Limita¸oes
c˜ <wheres>
Tipos de Dados <eq field="id"><int>10</int></eq>
Recomend´veis
a
SELECT: exemplo
</wheres>
SELECT: resultado </update>
INSERT
UPDATE
DELETE
XML-RPC
Mais informa¸oes
c˜
23 / 33
24. DELETE
Introdu¸˜o
ca
<delete table="clientes">
Motiva¸˜o
ca
<wheres>
Ponte com o Banco
de Dados <eq field="id"><int>10</int></eq>
Proposta de </wheres>
Gram´tica XML
a </delete>
para SQL
Limita¸oes
c˜
Tipos de Dados
Recomend´veis
a
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informa¸oes
c˜
24 / 33
25. Introdu¸˜o
ca
Motiva¸˜o
ca
Ponte com o Banco
de Dados
Proposta de
Gram´tica XML
a
para SQL
XML-RPC
Como funciona?
E em c´digo?
o
(Servidor)
XML-RPC
E em c´digo?
o
(Cliente)
No nosso caso,
juntando tudo
Mais informa¸oes
c˜
25 / 33
26. Como funciona?
Introdu¸˜o
ca
s Primeiro, temos um servi¸o HTTP num servidor que
c
Motiva¸˜o
ca
responde numa porta TCP espec´ ıfica.
Ponte com o Banco
de Dados s Codifica-se as fun¸˜es nesse servidor..
co
Proposta de
Gram´tica XML
a
s Depois, registramos cada fun¸˜o que pode ser chamada por
ca
para SQL um cliente.
XML-RPC
Como funciona?
s Um cliente inicia um processo que executa fun¸˜es naquele
co
E em c´digo?
o
(Servidor)
servidor.
E em c´digo?
o s Executa-se e avalia o resultado.
(Cliente)
No nosso caso,
juntando tudo
Mais informa¸oes
c˜
26 / 33
27. E em c´digo? (Servidor)
o
Introdu¸˜o
ca
Este seria o c´digo de um suposto “server.py”.
o
Motiva¸˜o
ca
Ponte com o Banco def ola_mundo():
de Dados return "ola mundo-cliente!"
Proposta de
Gram´tica XML
a
para SQL import SimpleXMLRPCServer
XML-RPC SimpleXMLRPCServer.allow_reuse_address = 1
Como funciona? server = SimpleXMLRPCServer(("127.0.0.1", 10000))
E em c´digo?
o
(Servidor) server.register_function(ola_mundo)
E em c´digo?
o server.serve_forever() # d´ para matar com C-c tranquilo
a
(Cliente)
No nosso caso,
juntando tudo
Mais informa¸oes
c˜
27 / 33
28. E em c´digo? (Cliente)
o
Introdu¸˜o
ca
Este seria, ent˜o, um “client.py”.
a
Motiva¸˜o
ca
Ponte com o Banco import xmlrpclib
de Dados s = xmlrpclib.Server("ip_do_servidor", 10000)
Proposta de print s.ola_mundo()
Gram´tica XML
a
para SQL
XML-RPC Executando:
Como funciona?
E em c´digo?
o $ python client.py
(Servidor)
E em c´digo?
o "ola mundo-cliente!"
(Cliente)
No nosso caso,
juntando tudo
Mais informa¸oes
c˜
28 / 33
29. No nosso caso, juntando tudo
Introdu¸˜o
ca
s O cliente acessa o servidor na porta 10000 no endere¸o IP
c
Motiva¸˜o
ca
desjado
Ponte com o Banco
de Dados s Chama a fun¸˜o execute, com um parˆmetro em XML
ca a
Proposta de
Gram´tica XML
a
s O retorno vem em XML
para SQL s Simples assim. Isso d´ margem a v´rias id´ias:
a a e
XML-RPC
Como funciona? x Colocar uma ponte geradora de XML na
E em c´digo?
o
(Servidor) aplica¸˜o-cliente.
ca
E em c´digo?
o
(Cliente) x Balancear a carga entre v´rios servidores XML-RPC.
a
No nosso caso,
juntando tudo
x Fazer uma ponte entre um servidor de objetos, que seria
Mais informa¸oes
c˜ o cliente nesta nossa solu¸˜o.
ca
29 / 33
30. Introdu¸˜o
ca
Motiva¸˜o
ca
Ponte com o Banco
de Dados
Proposta de
Gram´tica XML
a
para SQL
XML-RPC
Mais informa¸oes
c˜
Esta id´ia j´ teve
e a
Mais informa¸˜es
co
implementa¸oes!
c˜
O c´digo
o
That’s all folks!
30 / 33
31. Esta id´ia j´ teve implementa¸˜es!
e a co
Introdu¸˜o
ca
s XML-SQL Utility (XSU), da Oracle, que faz algo bem
Motiva¸˜o
ca
parecido; por´m, ´ para o Oracle, e ´ mais voltado para
e e e
Ponte com o Banco
de Dados extrair coisas do BD.
Proposta de
Gram´tica XML
a
s SQL Server exporta para XML tamb´m, mas n˜o ´ o caso.
e a e
para SQL
s Bom artigo de como fazer isso para MySQL:
XML-RPC
http://www.kitebird.com/articles/mysql-xml.html.
Mais informa¸oes
c˜
Esta id´ia j´ teve
e a s Existem iniciativas como o XPath que um dia ainda v˜oa
implementa¸oes!
c˜
O c´digo
o
implementar isso, pois j´ est˜o mesclando tudo na mesma
a a
That’s all folks! metodologia:
http://weblog.infoworld.com/udell/2003/03/12.html.
31 / 33
32. O c´digo
o
Introdu¸˜o
ca
s O c´digo est´ dispon´ no endere¸o abaixo:
o a ıvel c
Motiva¸˜o
ca
Ponte com o Banco http://slowhome.org/ferhr/tchelinux/
de Dados
Proposta de
Gram´tica XML
a
s Sob licen¸a BSD.
c
para SQL s ´
E qualidade Alfa para Beta, ent˜o cuidado!
a
XML-RPC
s Datas e outros tipos de dados aparecer˜o como <variant>,
a
Mais informa¸oes
c˜
Esta id´ia j´ teve
e a s´ para irritar.
o
implementa¸oes!
c˜
O c´digo
o
s Com exce¸˜o do driver, ´ escrito do zero.
ca e
That’s all folks! s Demorou dois dias para fazer, bem a tempo da palestra (´
e
verdade que um dia foi s´ debugs).
o
s Sacrifiquei a eficiˆncia e completude pela rapidez de
e
desenvolvimento.
s Vem com uma pequena su´ de testes, onde exemplos s˜o
ıte a
disparados.
s Aceito contribui¸˜es.
co
32 / 33
33. That’s all folks!
Introdu¸˜o
ca
So long and thanks for all the queries!
Motiva¸˜o
ca
plan9ner@gmail.com
Ponte com o Banco
de Dados
Proposta de
Gram´tica XML
a
para SQL
XML-RPC
Mais informa¸oes
c˜
Esta id´ia j´ teve
e a
implementa¸oes!
c˜
O c´digo
o
That’s all folks!
33 / 33