xml-rpc + python + banco de dados - fernando massen

33
1 / 33 XML-RPC + Python + Banco de Dados Fernando Massen 15 de novembro de 2006

Upload: tchelinux-slides

Post on 18-Dec-2014

972 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: XML-RPC + Python + Banco de Dados - Fernando Massen

1 / 33

XML-RPC + Python + Banco de Dados

Fernando Massen

15 de novembro de 2006

Page 2: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 3: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 4: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 5: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 6: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 7: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 8: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 9: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 10: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 11: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 12: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 13: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 14: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 15: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 16: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 17: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 18: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 19: XML-RPC + Python + Banco de Dados - Fernando Massen

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>

Page 20: XML-RPC + Python + Banco de Dados - Fernando Massen

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>

Page 21: XML-RPC + Python + Banco de Dados - Fernando Massen

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:

Page 22: XML-RPC + Python + Banco de Dados - Fernando Massen

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>

Page 23: XML-RPC + Python + Banco de Dados - Fernando Massen

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>

Page 24: XML-RPC + Python + Banco de Dados - Fernando Massen

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>

Page 25: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 26: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 27: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 28: XML-RPC + Python + Banco de Dados - Fernando Massen

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!"

Page 29: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 30: XML-RPC + Python + Banco de Dados - Fernando Massen

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

Page 31: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 32: XML-RPC + Python + Banco de Dados - Fernando Massen

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.

Page 33: XML-RPC + Python + Banco de Dados - Fernando Massen

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]