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

Python e bancos NoSQL

Embed Size (px)

DESCRIPTION

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

Citation preview

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