Python e MongoDB - Ensol
-
Upload
christiano-anderson -
Category
Technology
-
view
1.913 -
download
0
Embed Size (px)
Transcript of Python e MongoDB - Ensol

Python e MongoDBChristiano Anderson
Twitter: @dumpBlog: http://christiano.meEmail: [email protected]: http://www.gonow.com.br

• Trabalha com software livre desde 1995;
• Gerente de Projetos da Gonow;
• Desenvolvedor do Projeto GNU (FSF);
• Trabalha com Python desde 2000;
• Membro da equipe de tradução do MongoDB;
• Evangelista NoSQL;

O que é MongoDB?

O que é MongoDB?Banco de dados não relacional

O que é MongoDB?Banco de dados não relacional
Software Livre

O que é MongoDB?Banco de dados não relacional
Software LivreAlta performance

O que é MongoDB?Banco de dados não relacional
Software LivreAlta performance
Schema free

O que é MongoDB?Banco de dados não relacional
Software LivreAlta performance
Schema free
Orientado a documentos

“MongoDB preenche a lacuna entre modelagem chave/valor (o que são bem rápidas e escaláveis) e os
tradicionais banco de dados relacionais (que oferecem várias funcionalidades)”

Quem utiliza MongoDB
E muitos outros...

Bom para...

Bom para...
Web 2.0

Bom para...
Web 2.0Migrations

Bom para...
Web 2.0Migrations
Flexibilidade

Bom para...
Web 2.0Migrations
Flexibilidade
Caching

Não muito bom se você precisa de...

Não muito bom se você precisa de...
Transações

Não muito bom se você precisa de...
Transações
Suporte completo a SQL

Por que Python?

Por que Python?
Afinidade com a linguagem...

Por que Python?
Afinidade com a linguagem...
Facilidade em trabalhar com o modelo do MongoDB...

Por que Python?
Afinidade com a linguagem...
Facilidade em trabalhar com o modelo do MongoDB...
Vários módulos e ORMs prontos...

Modelo de documento

Modelo de documento
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10}

Modelo de documento
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10}
Sim, é um JSON. É muito fácil trabalhar com esse modelo de dados em
praticamente qualquer linguagem

Migrations?

Migrations?Você pode mudar dinamicamente seu documento...

Migrations?Você pode mudar dinamicamente seu documento...
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10}

Migrations?Você pode mudar dinamicamente seu documento...
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10}

Migrations?Você pode mudar dinamicamente seu documento...
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10}
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10,‘local’: ‘Gonow’}

Migrations?Você pode mudar dinamicamente seu documento...
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10}
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10,‘local’: ‘Gonow’}

Migrations?Você pode mudar dinamicamente seu documento...
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10}
{‘nome’: ‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10,‘local’: ‘Gonow’}
Você não precisa modificar o modelo de dados para adicionar novos elementos.
Basta inserir e salvar novamente!

Agregadores...
db.programmers.insert({“linguagem”:”python”})db.programmers.insert({“linguagem”:”perl”})db.programmers.insert({“linguagem”:”ruby”})db.programmers.insert({“linguagem”:”python”})

Agregadores...
db.programmers.insert({“linguagem”:”python”})db.programmers.insert({“linguagem”:”perl”})db.programmers.insert({“linguagem”:”ruby”})db.programmers.insert({“linguagem”:”python”})

Agregadores...
db.programmers.insert({“linguagem”:”python”})db.programmers.insert({“linguagem”:”perl”})db.programmers.insert({“linguagem”:”ruby”})db.programmers.insert({“linguagem”:”python”})

Agregadores...
db.programmers.insert({“linguagem”:”python”})db.programmers.insert({“linguagem”:”perl”})db.programmers.insert({“linguagem”:”ruby”})db.programmers.insert({“linguagem”:”python”})D
uplic
ados

Agregadores...
db.programmers.insert({“linguagem”:”python”})db.programmers.insert({“linguagem”:”perl”})db.programmers.insert({“linguagem”:”ruby”})db.programmers.insert({“linguagem”:”python”})D
uplic
ados
db.programmers.distinct(“language”)

Map/Reduce
É utilizado para criar funções especiais, pode sercomparado a uma stored procedure

Map/Reduce
É utilizado para criar funções especiais, pode sercomparado a uma stored procedure
Utiliza-se JavaScript para criar essas funções

Map/Reduce
É utilizado para criar funções especiais, pode sercomparado a uma stored procedure
Utiliza-se JavaScript para criar essas funções
Bastante flexível

Exemplo de Map/Reduce para contar tags repetidas
function() { this.tags.forEach(function(z)) { emit(z, 1);});}
function(key, value) { var total = 0; for(var i = 0; i < values.length; i++) { total += values[i]; } return total;}

SQL MongoDB
INSERT INTO USERS VALUES(1,1) db.users.insert({a:1, b:1})
SELECT a,b FROM users db.users.find({}, {a: 1, b: 1})
SELECT * FROM users db.users.find()
SELECT * FROM users WHERE age=33 db.users.find({age: 33})
SELECT * FROm users WHERE name = “pedro” db.users.find({name:”pedro”})
Comparando SQL e MongoDB 1/2

Comparando SQL e MongoDB 2/2
SQL MongoDB
SELECT * FROM users WHERE age=33 ORDER BY name
db.users.find({‘age’:33}).sort({name:1})
SELECT * FROM users WHERE age < 33
db.users.find({‘age’:{$lt:33}})})
CREATE INDEX myindexname ON user(name)
db.users.ensureIndex({name:1})
SELECT * FROM users WHERE a = 1 AND b = ‘q’ db.users.find({a:1, b:’q’})
SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20)

Outros recursos bacanasSuporte a índices;

Outros recursos bacanasSuporte a índices;
GridFS;

Outros recursos bacanasSuporte a índices;
GridFS;
Replicação de dados;

Outros recursos bacanasSuporte a índices;
GridFS;
Replicação de dados;
Alta disponibilidade;

Outros recursos bacanasSuporte a índices;
GridFS;
Replicação de dados;
Alta disponibilidade;
É software livre, mas também oferece suporte comercial!

Como trabalhar com MongoDB e Python

Como trabalhar com MongoDB e Python
PyMongo é o módulo para Python e MongoDB;

Como trabalhar com MongoDB e Python
PyMongo é o módulo para Python e MongoDB;
$ easy_install pymongo

Exemplo de uso

Exemplo de uso
>>> from pymongo import Connection>>> con = Connection(‘localhost’)>>> db = con[‘blog’]

Inserindo um registro
>>> post = {‘title’:‘Meu Primeiro Post’,... ‘author’:‘Christiano Anderson’,... ‘content’: ‘Esse eh um exemplo de conteudo’,... ‘tags’: [‘mongodb’,‘paraiba’,‘evento’,‘ensol’]}
>>> post = db[‘posts’]>>> post.insert(post)ObjectId(‘4cb662f508bf532b1b000000’)

Inserindo mais de um documento de uma só vez...
>>> other_posts = [{‘title’:‘Segundo post’,‘author’:‘Christiano Anderson’,‘tags’:[‘teste’],‘content’:‘Esse eh meu segundo post’},
ObjectId(‘4cb6651b08bf532b970000000’)]
{‘title’:‘Terceiro post’,‘author’:‘Luke Skywalker’,‘tags’:[‘naboo’,‘tatooine’],‘content’:‘Olah Princesa Leya’}
ObjectId(‘4cb6651b08bf532b970000001’)]

Pesquisando na base de dados com Python
>>> all_posts = db.post.find({})>>> for p in all_posts:... print p[‘title’]Meu primeiro postMeu segundo postOlah Princesa Leya!

Outras consultas
>>> p = db.posts.find_one({‘tags’:‘naboo’})
>>> p = db.users.find({‘age’:{‘$gte’:18}})

Outras consultas
>>> p = db.posts.find_one({‘tags’:‘naboo’})
>>> p = db.users.find({‘age’:{‘$gte’:18}})

Outras consultas
>>> p = db.posts.find_one({‘tags’:‘naboo’})
>>> p = db.users.find({‘age’:{‘$gte’:18}})
É possível usar operadores como $lt,$lte, $gt, $gte e outros

- ORM para MongoDB- Sintaxe bem similhar ao ORM do Django- Baixa curva de aprendizado- Bastante estável e eficiente
MongoEngine

- ORM para MongoDB- Sintaxe bem similhar ao ORM do Django- Baixa curva de aprendizado- Bastante estável e eficiente
$ easy_install mongoengine
MongoEngine

- ORM para MongoDB- Sintaxe bem similhar ao ORM do Django- Baixa curva de aprendizado- Bastante estável e eficiente
$ easy_install mongoengine
MongoEngine

- ORM para MongoDB- Sintaxe bem similhar ao ORM do Django- Baixa curva de aprendizado- Bastante estável e eficiente
$ easy_install mongoengine
MongoEngine
http://www.mongoengine.org

from mongoengine import * class Usuario(Document): nome = StringField(required=True) email = StringField()
Exemplo MongoEngine

from mongoengine import * class Usuario(Document): nome = StringField(required=True) email = StringField()
Exemplo MongoEngine
u = Usuario()u.nome = “Christiano”u.email = “[email protected]”u.save()

from mongoengine import * class Usuario(Document): nome = StringField(required=True) email = StringField()
Exemplo MongoEngine
u = Usuario()u.nome = “Christiano”u.email = “[email protected]”u.save()

from mongoengine import * class Usuario(Document): nome = StringField(required=True) email = StringField()
Exemplo MongoEngine
u = Usuario()u.nome = “Christiano”u.email = “[email protected]”u.save() Salvou no banco

Consulta MongoEngine
for u in User.objects: print u.nome, u.email

MongoDB e Django
É possível, mas ainda não tem umasolução oficial

MongoDB e Django
Pontos mais críticos na integração com Django:- Autenticação;- Sessões;- Admin;- Outras questões amarradas ao ORM...

Django-MongoDB
Pacote depende do django-nonrel e djangotoolbox
Mais informações:
http://django-mongodb.org/

Django-MongoDB - Como instalar
hg clone http://bitbucket.org/wkornewald/django-nonrelcd django-nonrel && python setup.py install
hg clone http://bitbucket.org/wkornewald/djangotoolboxcd djangotoolbox && python setup.py install
git clone https://github.com/django-mongodb-engine/mongodb-enginecd mongodb-engine && python setup.py install
Django-nonrel
Djangotoolbox
Django-mongodb-engine

Django-MongoDB - recursos interessantes
É possível utilizar GridFS, MapReduce,cache, agregadores e demais funcionalidadesdo MongoDB
http://django-mongodb.org/topics/index.html
Mais informações:

settings.py
DATABASES = { 'default' : { 'ENGINE' : 'django_mongodb_engine', 'NAME' : 'my_database' }}
Agora é só desenvolver sua app no Django :-)

Como colaborar?
Lista: http://groups.google.com/group/mongodb-user
#MongoDB no irc.freenode.org

Experimente o MongoDB
Você pode experimentar o MongoDBsem precisar instalar nada!
http://try.mongodb.org/

Obrigado! :-)
Christiano Anderson
Twitter: @dump
Blog: http://christiano.me