xml-rpc + python + banco de dados - fernando massen
DESCRIPTION
TRANSCRIPT
1 / 33
XML-RPC + Python + Banco de Dados
Fernando Massen
15 de novembro de 2006
Introducao
Introducao
Fernando
Objetivos
Python
XML
XML-RPC
SQL
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
2 / 33
Fernando
Introducao
Fernando
Objetivos
Python
XML
XML-RPC
SQL
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
3 / 33
■ Desenvolvo software para backend corporativo■ Tem um pouco de tudo, inclusive Python■ Desde o Python 1.5, porem usando de verdade a partir do
2.1■ Principalmente para tarefas onde o tempo e crucial■ Obviamente tambem por causa da facilidade
Objetivos
Introducao
Fernando
Objetivos
Python
XML
XML-RPC
SQL
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
4 / 33
■ Demonstrar o protocolo XML-RPC do ponto de vista dodesenvolvedor de aplicacoes.
■ Mostrar a facilidade de programacao em Python.■ Fornecer novas ideias para desenvolvimento utilizando uma
linguagem-ponte unica entre bancos de dados.■ Juntar tudo isto: Python, SQL, XML e RPC.■ Distribuir um pequeno codigo-exemplo que demonstra estes
acronimos juntos.■ Se der tempo, demonstrar parte do codigo.
Python
Introducao
Fernando
Objetivos
Python
XML
XML-RPC
SQL
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
5 / 33
Mesmo que eu esteja apenas rezando para o clero, nao custacitar algumas virtudes do Python:
■ Uma linguagem absurdamente facil de aprender■ Tem uma implementacao de Orientacao a Objeto
desburocratizada, apesar de incompleta■ E software livre – um grande diferencial em ambientes
corporativos■ Roda em mais plataformas do que Java (pelo menos a
implementacao da Sun)■ E facil de estender (criar novos modulos)■ Vem com um mundo de funcionalidades ja incluıdo
XML
Introducao
Fernando
Objetivos
Python
XML
XML-RPC
SQL
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
6 / 33
E aquele encoding de texto que todo mundo conhece.
■ Apesar de repetitivo, e de facil entendimento para os sereshumanos.
■ A complexidade fica nas aplicacoes, ja que a mensagem naocontem inteligencia.
■ Se utilizado um encoding de texto como UTF-8, deriva numamensagem praticamente universal.
■ Pode significar qualquer coisa (ao mesmo tempo que naoespecifica o que significa).
■ Apesar de suas desvantagens, sabemos que vai ficar.
XML-RPC
Introducao
Fernando
Objetivos
Python
XML
XML-RPC
SQL
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
7 / 33
E o meio de transporte escolhido para demonstrar a ideia.
■ Poderia ter implementado esta ponte com sockets. Sim, mas:
◆ Demoraria mais para implementar. Isto tem que ser facil!
◆ Nao e necessario mudar os designs de boa parte docodigo ao trocar o transporte.
◆ Teria que cuidar de varios aspectos que o XML-RPC fazsozinho.
■ E um meio de transporte estupidamente facil de seimplementar.
■ E simples. Essa simplicidade tem a cara do Python.
SQL
Introducao
Fernando
Objetivos
Python
XML
XML-RPC
SQL
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
8 / 33
Indispensavel:
■ E uma linguagem funcional para manipulacao de bancos dedados.
■ E um padrao de facto.■ Possui certas incompatibilidades entre fornecedores, mas as
diferencas sao contornaveis atraves da aderencia de padroes(SQL92, SQL99, etc.) e de interfaces universalizadas (comoesta!)
■ Ainda nao da para abandonar os bancos de dados relacionaispara utilizar somente a orientacao a objeto:
◆ Acaba-se criando pontes OO-relacionais.◆ Ocorre conversao de dados entre varios tipos diversos.◆ BDs relacionais simplesmente funcionam! Estao aı
implementados ha mais decadas, inclusive, que a propriaOO.
Motivacao
Introducao
Motivacao
Uma interface unicacom Bancos deDadosNao ha gramaticasXML para SQL noW3C!SQL tem a cara doXML!
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
9 / 33
Uma interface unica com Bancos de Dados
Introducao
Motivacao
Uma interface unicacom Bancos deDadosNao ha gramaticasXML para SQL noW3C!SQL tem a cara doXML!
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
10 / 33
■ Criar especificacoes para cada banco de dados e uma tarefapenosa.
■ Gerenciar as diferencas entre os engines no codigo so comSQL e um trabalho de Sısifo.
■ Mesmo assim, configurar acesso a banco de dados e de certaforma complicado, e mudar isso mesmo que emdesenvolvimento gera tempo.
■ Manter SQL manualmente da chance a erros Homericos.■ O formato dos dados retornados e sempre peculiar a cada
linguagem. Tendo uma so maneira de retornar os dadospermite que haja uma independencia total dalinguagem-cliente.
Nao ha gramaticas XML para SQL no W3C!
Introducao
Motivacao
Uma interface unicacom Bancos deDadosNao ha gramaticasXML para SQL noW3C!SQL tem a cara doXML!
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
11 / 33
■ No W3C, vive-se num tempo pos-moderno em termos deprogramacao: os sistemas teoricamente nao possuem legado,tudo e tratado com mais e mais gramaticas XML, movidas aWeb Semantica.
■ XML serviria para trocas entre dados, nao paraprocessamento interno.
■ Seria interessante como API de manipulacao; nao e a toaque criaram-se facilidades como XML-RPC, SOAP, WSDL...
■ Um grande potencial de processamento remoto e distribuıdonao esta sendo utilizado.
■ O ideal seria reescrever o SQL em XML, e “forcar” osfabricantes a adotar este padrao (utopias mil!)
■ Menos inconsistencias, menos retrabalho – hoje nao hanenhuma vantagem inerente no SQL para fazer um Banco deDados vender mais do que o outro.
SQL tem a cara do XML!
Introducao
Motivacao
Uma interface unicacom Bancos deDadosNao ha gramaticasXML para SQL noW3C!SQL tem a cara doXML!
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
12 / 33
■ O SQL foi criado numa epoca sem as possibilidades epadroes da Web.
■ Provavelmente, se fosse criado hoje, adotaria uma gramaticaXML.
■ E possıvel que seja ainda mais odiado.■ Possibilidades interessantes para os fabricantes poderiam ter
surgido: criar queries com “desenhistas de XML”, ouderivando tabelas diretamente de notacoes como UML.
■ Para o sistema que voce esteja criando, a questao do bancode dados torna-se irrelevante.
Ponte com o Banco de Dados
Introducao
Motivacao
Ponte com o Bancode DadosEscolhi oPostgreSQL
Codigo de conexaocom BD
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
13 / 33
Escolhi o PostgreSQL
Introducao
Motivacao
Ponte com o Bancode DadosEscolhi oPostgreSQL
Codigo de conexaocom BD
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
14 / 33
■ Neste ponto utiliza-se um driver normal de banco de dados.Escolhi um (pyPgSQL) que e bastante popular.
■ Tenha em mente que coisas como triggers, views e coisas dogenero sao inerentes a cada banco de dados.
■ A manutencao do banco de dados nao e abordada pelaapresentacao. Imagino que o bom administrador saibaadministrar seu banco de dados e tenha interfacesapropriadas para o mesmo.
■ Nada impediria de extender a “gramatica” XML para aadministracao do proprio BD; porem aı e que moram asmaiores incompatibilidades entre os BDs e, portanto, osmaiores problemas.
■ Com o nosso exemplo de codigo, bastaria adaptar duas outres funcoes as saıdas de drivers Python, e estaria pronto umnovo “driver”.
Codigo de conexao com BD
Introducao
Motivacao
Ponte com o Bancode DadosEscolhi oPostgreSQL
Codigo de conexaocom BD
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
15 / 33
Usando pyPgSQL:
from pyPgSQL import libpq
dbconn = libpq.PQconnectdb("host=dbserver
dbname=python user=pguser")
ret = dbconn.query(sqlstream)
# ret e um objeto estilo ‘‘Resultset’’,
# com varias propriedades
# se acontecer um erro, acontece antes disso
Proposta de Gramatica XML para SQL
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
16 / 33
Limitacoes
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
17 / 33
■ O XML aceita qualquer notacao; o que equivaleria aqualquer tipo de dados.
■ O SQL nao – isso depende do fornecedor.■ Pelo menos alguns tipos de dados sao comuns entre os
fornecedores de BD; entao nivela-se por baixo: temosnumeros inteiros, inteiros longos, numeros decimais, datas,booleanos e strings.
■ As datas podem ser representadas como inteiros longos,baseados no conceito de epoch.
■ As implementacoes de booleano variam largamente. Umaconvencao e necessaria: sugiro 0 para falso e qualquer outrovalor para verdadeiro.
■ Os exemplos a seguir sao uma proposta do que e possıvel.
Tipos de Dados Recomendaveis
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
18 / 33
Praticamente todos os bancos de dados suportam, de algumaforma, estes tipos de dados:
■ int■ long■ string■ dec■ bool
O restante sao especializacoes que nao sao comuns a grandemaioria de aplicacoes existentes.
SELECT: exemplo
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
19 / 33
<select>
<fields>
<field name="clientes.id" />
<field name="clientes.nome" />
<field name="clientes.nascimento" />
<field name="endereco.nome" as="endereco" />
</fields>
<froms>
<table name="clientes">
<inner_join table="enderecos"
on="clientes.endereco=enderecos.id" />
</table>
</froms>
<wheres>
<eq field="clientes.id"><int>3</int></eq>
</wheres>
</select>
SELECT: resultado
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
20 / 33
Esta e uma proposicao de saıda a esta query.
<result>
<row>
<id><int>50</int></id>
<nome><string>Jo~ao da Esquina</string></nome>
<nascimento>
<variant>18/11/1980</variant>
</nascimento>
<endereco><string>Rua sem Numero</string></endereco>
</row>
</result>
INSERT
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
21 / 33
<insert into="clientes">
<field name="id"><int>10</int></field>
<field name="nome"><string>Jo~ao da Costa</string></field>
</insert>
Ou entao um INSERT com um SELECT dentro:
INSERT (cont.)
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
22 / 33
<insert into="clientes">
<fields>
<field name="id" />
<field name="nome" />
</fields>
<select>
<fields>
<field name="id" />
<field name="nome" />
</fields>
<froms>
<table name="clientes" />
</froms>
<wheres>
<eq field="id"><int>15</int></eq>
</wheres>
</select>
</insert>
UPDATE
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
23 / 33
<update table="clientes">
<fields>
<field name="name"><string>Joao da Costa
Netto</string></field>
</fields>
<wheres>
<eq field="id"><int>10</int></eq>
</wheres>
</update>
DELETE
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
Limitacoes
Tipos de DadosRecomendaveis
SELECT: exemplo
SELECT: resultado
INSERT
UPDATE
DELETE
XML-RPC
Mais informacoes
24 / 33
<delete table="clientes">
<wheres>
<eq field="id"><int>10</int></eq>
</wheres>
</delete>
XML-RPC
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Como funciona?E em codigo?(Servidor)
E em codigo?(Cliente)
No nosso caso,juntando tudo
Mais informacoes
25 / 33
Como funciona?
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Como funciona?E em codigo?(Servidor)
E em codigo?(Cliente)
No nosso caso,juntando tudo
Mais informacoes
26 / 33
■ Primeiro, temos um servico HTTP num servidor queresponde numa porta TCP especıfica.
■ Codifica-se as funcoes nesse servidor..■ Depois, registramos cada funcao que pode ser chamada por
um cliente.■ Um cliente inicia um processo que executa funcoes naquele
servidor.■ Executa-se e avalia o resultado.
E em codigo? (Servidor)
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Como funciona?E em codigo?(Servidor)
E em codigo?(Cliente)
No nosso caso,juntando tudo
Mais informacoes
27 / 33
Este seria o codigo de um suposto “server.py”.
def ola_mundo():
return "ola mundo-cliente!"
import SimpleXMLRPCServer
SimpleXMLRPCServer.allow_reuse_address = 1
server = SimpleXMLRPCServer(("127.0.0.1", 10000))
server.register_function(ola_mundo)
server.serve_forever() # da para matar com C-c tranquilo
E em codigo? (Cliente)
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Como funciona?E em codigo?(Servidor)
E em codigo?(Cliente)
No nosso caso,juntando tudo
Mais informacoes
28 / 33
Este seria, entao, um “client.py”.
import xmlrpclib
s = xmlrpclib.Server("ip_do_servidor", 10000)
print s.ola_mundo()
Executando:
$ python client.py
"ola mundo-cliente!"
No nosso caso, juntando tudo
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Como funciona?E em codigo?(Servidor)
E em codigo?(Cliente)
No nosso caso,juntando tudo
Mais informacoes
29 / 33
■ O cliente acessa o servidor na porta 10000 no endereco IPdesjado
■ Chama a funcao execute, com um parametro em XML■ O retorno vem em XML■ Simples assim. Isso da margem a varias ideias:
◆ Colocar uma ponte geradora de XML naaplicacao-cliente.
◆ Balancear a carga entre varios servidores XML-RPC.◆ Fazer uma ponte entre um servidor de objetos, que seria
o cliente nesta nossa solucao.
Mais informacoes
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
Esta ideia ja teveimplementacoes!
O codigo
That’s all folks!
30 / 33
Esta ideia ja teve implementacoes!
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
Esta ideia ja teveimplementacoes!
O codigo
That’s all folks!
31 / 33
■ XML-SQL Utility (XSU), da Oracle, que faz algo bemparecido; porem, e para o Oracle, e e mais voltado paraextrair coisas do BD.
■ SQL Server exporta para XML tambem, mas nao e o caso.■ Bom artigo de como fazer isso para MySQL:
http://www.kitebird.com/articles/mysql-xml.html.■ Existem iniciativas como o XPath que um dia ainda vao
implementar isso, pois ja estao mesclando tudo na mesmametodologia:http://weblog.infoworld.com/udell/2003/03/12.html.
O codigo
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
Esta ideia ja teveimplementacoes!
O codigo
That’s all folks!
32 / 33
■ O codigo esta disponıvel no endereco abaixo:
http://slowhome.org/ferhr/tchelinux/
■ Sob licenca BSD.■ E qualidade Alfa para Beta, entao cuidado!■ Datas e outros tipos de dados aparecerao como <variant>,
so para irritar.■ Com excecao do driver, e escrito do zero.■ Demorou dois dias para fazer, bem a tempo da palestra (e
verdade que um dia foi so debugs).■ Sacrifiquei a eficiencia e completude pela rapidez de
desenvolvimento.■ Vem com uma pequena suıte de testes, onde exemplos sao
disparados.■ Aceito contribuicoes.
That’s all folks!
Introducao
Motivacao
Ponte com o Bancode Dados
Proposta deGramatica XMLpara SQL
XML-RPC
Mais informacoes
Esta ideia ja teveimplementacoes!
O codigo
That’s all folks!
33 / 33
So long and thanks for all the [email protected]