A maior rede de estudos do Brasil

Grátis
360 pág.
python_para_desenvolvedores_2ed

Pré-visualização | Página 20 de 47

Arquivo XML de saída:
<Canino>
 <Lobo>
 <Coiote />
 <Cachorro cor="Branco" nome="Bandit" raca="Labrador" />
 </Lobo>
 <Raposa />
</Canino>
Exemplo de leitura do arquivo XML:
from xml.etree.ElementTree import ElementTree
tree = ElementTree(file='caninos.xml')
root = tree.getroot()
# Lista os elementos abaixo do root
print root.getchildren()
# Encontra o lobo
lobo = root.find('Lobo')
# Encontra o cachorro
cachorro = lobo.find('Cachorro')
print cachorro.tag, cachorro.attrib
# Remove a raposa
164 XML
root.remove(root.find('Raposa'))
print root.getchildren()
Saída:
[<Element Lobo at ab3a58>, <Element Raposa at ab3b70>]
Cachorro {'cor': 'Branco', 'raca': 'Labrador', 'nome': 'Bandit'}
[<Element Lobo at ab3a58>]
O XML é muito útil por facilitar a interoperabilidade entre sistemas, mesmo 
que estes sejam desenvolvidos em tecnologias diferentes.
Banco de dados 165
Banco de dados
Sistemas Gerenciadores de Banco de Dados (SGBDs) são reconhecidos por 
prover uma forma de acesso consistente e confiável para informações.
A maioria dos SGDB atuais são baseados no modelo relacional, no qual as 
informações são representadas na forma de tabelas. Geralmente, estas tabelas 
podem ser consultadas através de uma linguagem especializada para isso, 
chamada SQL (Structured Query Language).
Geralmente, os SGBDs utilizam a arquitetura cliente-servidor. Os aplicativos 
usam a API cliente para poder se comunicar com o servidor, que é o 
responsável por receber as consultas dos clientes, interpretar as sentenças 
SQL e recuperar os dados com um tempo de resposta adequado.
Para fazer isso, o servidor precisa realizar uma série de outras tarefas, tais 
como: verificar credenciais, controlar o acesso, gerenciar conexões de rede, 
manter a integridade dos dados, otimizar as consultas e resolver questões de 
concorrência.
Servidor
Processo
ArquivosArquivosArquivos
Cliente
API Cliente
Aplicativo
Rede
Processo
166 Banco de dados
No Python, a integração com SGBDs é feita na maioria dos casos através de 
um módulo DBI., que usa a API cliente para se comunicar com o banco de 
dados.
DBI
Database Interface (DBI) é uma especificação que descreve como deve ser o 
comportamento de um módulo de acesso a sistemas de banco de dados.
A DBI define que o módulo deve ter uma função connect(), retorna objetos de 
conexão. A partir do do objeto conexão, é possível obter um objeto cursor, 
que permite a execução de sentenças SQL e a recuperação dos dados (uma 
lista de tuplas com os resultados, por default).
MySQL
O MySQL é um SGBD cliente-servidor reconhecido pelo bom desempenho e é 
bastante usado como backend para aplicações Web.
Interpretador
DBI
Programa
As consultas são sentenças SQL 
e as respostas são listas de 
tuplas ou dicionários.
SGBD
O módulo DBI (Database 
Interface) é um driver especifico 
para o SGBD.
Banco de dados 167
Exemplo de acesso através de DBI com MySQL34:
# -*- coding: utf-8 -*-
import MySQLdb
# Cria uma conexão
con = MySQLdb.connect(db='test', user='root', passwd='')
# Cria um cursor
cur = con.cursor()
# Executa um comando SQL
cur.execute('show databases')
# Recupera o resultado
recordset = cur.fetchall()
# Mostra o resultado
for record in recordset:
 print record
# Fecha a conexão
con.close()
Saída:
('information_schema',)
('mysql',)
('test',)
O resultado é composto por uma lista de tuplas com as databases disponíveis 
no servidor.
SQLite
A partir da versão 2.5, o Python passou a incorporar em sua distribuição um 
módulo DBI para acessar o SQLite35.
34 Binários, fontes e documentação podem ser encontrados em: 
http://sourceforge.net/projects/mysql-python.
35 Documentação, fontes e binários podem ser encontrados em: http://www.sqlite.org/.
168 Banco de dados
SQLite é uma biblioteca Open Source escrita em linguagem C, que implementa 
um interpretador SQL, e provê funcionalidades de banco de dados, usando 
arquivos, sem a necessidade de um processo servidor separado ou de 
configuração manual.
Exemplo:
# -*- coding: utf-8 -*-
import sqlite3
# Cria uma conexão e um cursor
con = sqlite3.connect('emails.db')
cur = con.cursor()
# Cria uma tabela
sql = 'create table emails '\
 '(id integer primary key, '\
 'nome varchar(100), '\
 'email varchar(100))'
cur.execute(sql)
# sentença SQL para inserir registros
sql = 'insert into emails values (null, ?, ?)'
# Dados
recset = [('jane doe', 'jane@nowhere.org'),
 ('rock', 'rock@hardplace.com')]
# Insere os registros
for rec in recset:
 cur.execute(sql, rec)
# Confirma a transação
con.commit()
# Seleciona todos os registros
cur.execute('select * from emails')
# Recupera os resultados
recset = cur.fetchall()
# Mostra
for rec in recset:
 print '%d: %s(%s)' % rec
Banco de dados 169
# Fecha a conexão
con.close()
A vantagem mais significativa de usar o SQLite é a praticidade, 
principalmente no uso em aplicativos locais para desktops, aonde usar um 
SGBD convencional seria desnecessário e complicado de manter.
Firebird
Firebird36 é um SGBD cliente-servidor leve, porém com muitos recursos. 
Programas em Python podem se comunicar com ele através do driver DBI 
KInterbasDB37.
Exemplo:
# -*- coding: latin1 -*-
import kinterbasdb
#Para criar a base
# isql -u sysdba -p xXxXxXx
# create database '\temp\cds.fdb';
#
# conecta o Firebird
con = kinterbasdb.connect(dsn='localhost:/temp/cds.fdb',
 user='sysdba', password='xXxXxXx')
# Cria um objeto cursor
cur = con.cursor()
sql = "create table cds("\
"nome varchar(20),"\
"artista varchar(20),"\
"ano integer,"\
"faixas integer,"\
"primary key(nome, artista, ano));"
# Cria uma tabela
36 Disponível em: http://www.firebirdsql.org/.
37 Última versão: http://www.firebirdsql.org/index.php?op=devel&sub=python.
170 Banco de dados
cur.execute(sql)
# Grava as modificações
con.commit()
dados = [
 ('IV', 'Led Zeppelin', 1971, 8),
 ('Zenyattà Mondatta', 'The Police', 1980, 11),
 ('OK Computer', 'Radiohead', 1997, 12),
 ('In Absentia', 'Porcupine Tree', 2002, 12),
 ]
# Insere os registros e faz a interpolação
insert = "insert into cds"\
"(nome, artista, ano, faixas) values (?, ?, ?, ?)"
cur.executemany(insert, dados)
con.commit()
# Consulta os registros
cur.execute("select * from cds order by ano")
# Recupera os resuldados
for reg in cur.fetchall():
 # Formata e imprime
 print ' - '.join(str(i) for i in reg)
Saída:
IV - Led Zeppelin - 1971 – 8
Zenyattà Mondatta - The Police - 1980 – 11
OK Computer - Radiohead - 1997 – 12
In Absentia - Porcupine Tree - 2002 - 12
Como o Firebird não requer muita potência e nem muito esforço para 
administração, ele pode ser usado tanto como servidor, quanto ser 
empacotado junto com um aplicativo desktop.
PostgreSQL
Para sistemas que demandam recursos mais sofisticados do SGBD, o 
PostgreSQL38 é a solução Open Source mais completa disponível. O software 
38 Site oficial em http://www.postgresql.org/ e site da comunidade brasileira em 
http://www.postgresql.org.br/.
Banco de dados 171
segue a arquitetura cliente-servidor e é distribuído sob a licença BSD.
Entre os recursos oferecidos pelo PostgreSQL, destacam-se:
▪ Suporte a consultas complexas.
▪ Transações.
▪ Controle de concorrência multi-versão.
▪ Tipos de objetos definidos pelo usuário.
▪ Herança.
▪ Views.
▪ Stored Procedures.
▪ Triggers.
▪ Full text search.
Existem vários módulos que provêm acesso ao PostgreSQL para o Python, 
como o PygreSQL39 e o Psycopg40.
O PygreSQL oferece duas interfaces distintas para acesso a servidores 
PostgreSQL: