Python e MongoDB - Ensol

Post on 29-Jan-2018

1.924 views 0 download

Transcript of Python e MongoDB - Ensol

Python e MongoDBChristiano Anderson

Twitter: @dumpBlog: http://christiano.meEmail: anderson@gonow.com.brSite: 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 = “anderson@gonow.com.br”u.save()

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

Exemplo MongoEngine

u = Usuario()u.nome = “Christiano”u.email = “anderson@gonow.com.br”u.save()

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

Exemplo MongoEngine

u = Usuario()u.nome = “Christiano”u.email = “anderson@gonow.com.br”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

anderson@gonow.com.br

Twitter: @dump

Blog: http://christiano.me