python e bancos nosql

Post on 28-Nov-2014

3.300 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

marinho@gmail.comhttp://www.marinhobrandao.com

http://www.aprendendodjango.com

top related