python e bancos nosql
DESCRIPTION
Slides da palestra sobre Python com bancos de dados NoSQL no FLISOL de Goiânia, 2010TRANSCRIPT
Python com bancos de dados NoSQL
Marinho Brandão, FLISOL 2010, Goiânia
Quem é o palestrante
Quem é o palestrante
É pragmático Desenvolvedor há 14 anos Autônomo, consultor e desenvolvedor Co-fundador da comunidade Django brasileira Autor do Geraldo Reports Programador Python do Ano em 2009 Estudando Automação Industrial
O que é NoSQL?
O que é NoSQL?
Também chamados de MRMM e schemaless
Documentos, key/value, objetos, XML
Oferecem vantagens para escalar horizontalmente
Não possuem modelo rígido
Evita todo tipo normalização
Evita transações ACID (atomicidade, consistência, isolamento e durabilidade)
Alguns suportam conexão assíncrona e REST
Muito utilizados como apoio a RDBMS
Melhor adaptados à nuvem
Alguns bancos NoSQL
CouchDB MongoDB Redis MemcacheDB Tokyo Cabinet HyperTable ZoDB
Google BigTable Amazon SimpleDB Db4o Caché Hbase etc.
CouchDB
CouchDB
Parte da Apache Foundation
Suporta conexões assíncronas e REST
Escrito em Erlang
Armazena documentos JSON independentes
Um dos mais elegantes, mas ainda é lento
Suporta requisições HTTP e JavaScript
Replicação consistente
Adotado pelo Ubuntu 9.10
Exemplo: create, update e FK
# -*- coding: utf-8 -*-from couchdb.client import Server
conexao = Server('http://localhost:5984')db = conexao['palestra']
marinho_id = db.create({'nome': u'Marinho', 'idade': 28})marinho = db[marinho_id]
leticia_id = db.create({'nome': 'Leticia', 'idade': 29, 'esposo': marinho_id})leticia = db[leticia_id]
marinho['esposa'] = leticia_iddb[marinho_id] = marinho
print db[leticia_id], db[marinho_id]
Exemplo de código que cria um documento, atualiza e faz um relacionamento
Exemplo: Pseudo-Modelosfrom couchdb.client import Server, PreconditionFailedfrom couchdb.schema import Document, TextField, IntegerField, ListField
conexao = Server('http://localhost:5984')
try: db = conexao.create('palestra')except PreconditionFailed: del conexao['palestra']; db = conexao.create('palestra')
class Pessoa(Document): nome = TextField() idade = IntegerField() filhos = ListField(TextField)
tarsila = Pessoa(nome='Tarsila', idade=4, id='1'); tarsila.store(db)linus = Pessoa(nome='Linus', idade=0, id='2'); linus.store(db)
marinho = Pessoa(nome=u'Marinho', idade=28, filhos=[tarsila.id, linus.id])marinho.store(db)leticia = Pessoa(nome=u'Leticia', idade=29, filhos=[tarsila, linus])leticia.store(db)
for obj_id in db: print db[obj_id]['nome']
MongoDB
s
MongoDB
Escrito em C Possui uma camada na memória antes de
persistir Boa performance Armazena BSON em namespaces Não suporta conexões assíncronas Suporta REST Bom suporte a sharding e replicação
# -*- coding: utf-8 -*-from pymongo.connection import Connection
conexao = Connection(host='localhost', port=27017)ns = conexao.palestra.pessoas
ns.remove()
mar_id = ns.save({'nome': u'Marinho', 'idade': 28})mar = ns.find_one({'_id': mar_id})
let_id = ns.save({'nome': 'Leticia', 'idade': 29, 'esposo': mar_id})let = ns.find_one({'_id': let_id})
for p in ns.find(): e = 'esposo' in p and ns.find_one({'_id': p['esposo']}) or None print 'Nome:', p['nome'], e and 'Esposo(a): ' + e['nome'] or ''
Exemplo: removendo, criando, carregando
Exemplo de remoção de namespace, criação e carregamento de documentos com referencia a outro documento.
Redis
Redis
Escrito em C Trabalha como uma camada de cache em
memória, mas mantém persistência em disco Armazena valores com tipagem estática Performance excelente Quase nenhum recurso para cálculos Bom suporte a sharding e replicação
Exemplo: registros persistentes ou que expiram
# -*- coding: utf-8 -*-import redis, time
con = redis.Redis('localhost', db=1)
mar_id = '00001'; let_id = '00002'
print '\nAntes:', '\n\t', con.get(mar_id), '\n\t', con.get(let_id)
con.set(mar_id, {'nome': u'Marinho', 'idade': 28})
con.set(let_id, {'nome': 'Leticia', 'idade': 29, 'esposo': mar_id})con.expire(let_id, 5) # segundos para expirar
print '\nGravou:', '\n\t', con.get(mar_id), '\n\t', con.get(let_id)
time.sleep(7)
print '\nExpirou:', '\n\t', con.get(mar_id), '\n\t', con.get(let_id)
con.disconnect()
Exemplo de funcionalidades básicas do Redis, incluindo registros que expiram
Referências
http://en.wikipedia.org/wiki/NoSQL
http://couchdb.apache.org/
http://www.mongodb.org/
http://code.google.com/p/redis/
http://groups.google.com/group/MRNN-Brasil
http://nosql.mypopescu.com/post/276069660/nosql-libraries
http://labs.mudynamics.com/wp-content/uploads/2009/04/icouch.html
http://bret.appspot.com/entry/how-friendfeed-uses-mysql
http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-
migrated-from-mysql-to-mongodb/
http://code.google.com/p/redis/wiki/IntroductionToRedisDataTypes
http://escalabilidade.com/2010/03/08/introducao-ao-nosql-parte-i/
Perguntas?
Marinho Brandão
[email protected]://www.marinhobrandao.com
http://www.aprendendodjango.com