Python e bancos NoSQL

18
Python com bancos de dados NoSQL Marinho Brandão, FLISOL 2010, Goiânia

description

Slides da palestra sobre Python com bancos de dados NoSQL no FLISOL de Goiânia, 2010

Transcript of Python e bancos NoSQL

Page 1: Python e bancos NoSQL

Python com bancos de dados NoSQL

Marinho Brandão, FLISOL 2010, Goiânia

Page 2: Python e bancos NoSQL

Quem é o palestrante

Page 3: Python e bancos NoSQL

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

Page 4: Python e bancos NoSQL

O que é NoSQL?

Page 5: Python e bancos 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

Page 6: Python e bancos NoSQL

Alguns bancos NoSQL

CouchDB MongoDB Redis MemcacheDB Tokyo Cabinet HyperTable ZoDB

Google BigTable Amazon SimpleDB Db4o Caché Hbase etc.

Page 7: Python e bancos NoSQL

CouchDB

Page 8: Python e bancos NoSQL

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

Page 9: Python e bancos NoSQL

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

Page 10: Python e bancos NoSQL

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']

Page 11: Python e bancos NoSQL

MongoDB

s

Page 12: Python e bancos NoSQL

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

Page 13: Python e bancos NoSQL

# -*- 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.

Page 14: Python e bancos NoSQL

Redis

Page 15: Python e bancos NoSQL

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

Page 16: Python e bancos NoSQL

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

Page 17: Python e bancos NoSQL

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/

Page 18: Python e bancos NoSQL

Perguntas?

Marinho Brandão

[email protected]://www.marinhobrandao.com

http://www.aprendendodjango.com