Upload
christiano-anderson
View
1.921
Download
0
Embed Size (px)
Citation preview
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