Using MongoDB

 

in Python Apps

PyCon Ukraine 2014

Zaika Vladyslav

SQL vs NOSQL

NOSQL: 

  • Нет привычного SQL
  • Без структуры
  • Данные в виде агрегатов
  • в 21 столетие с NOSQL

SQL vs NOSQL

MongoDB

  • безструктурность
  • устойчивость
  • транзакции
  • обработка данных
  • геопространственные даные
  • возраст

Pymongo

    pip install pymongo

Install pymongo

Connect to Mongo

    from pymongo import MongoClient

    client = MongoClient('localhost', 27017)

    client = MongoClient('mongodb://localhost:27017/')

Start Mongo

    mongod --dbpath /test/db --port 12345

Pymongo

Simple use

    db = client.test
    posts = db.posts
    posts.insert([{"author": "Mike",
                   "text": "Good post!",
                   "tags": ["bulk", "insert"],
                   "date": datetime.datetime(2009, 
                                    11, 12, 11, 14)},
                  {"author": "Eliot",
                   "title": "MongoDB is fun",
                   "text": "Good post!",
                   "date": datetime.datetime(2009, 
                                    11, 10, 10, 45)}])

Pymongo

    posts.find_one({"text": "Good post!"})

    Output: {u'text': u'Good post!',
             u'_id': ObjectId('544fee5a2d1b111590bf669b'), 
             u'author': u'Mike', 
             u'tags': [u'bulk', u'insert']}

find_one()

find() 

    for post in posts.find({'text':'Good post!'}):
	print post

    Output: {u'text': u'Good post!', 
             u'_id': ObjectId('544fee5a2d1b111590bf669b'), 
             u'author': u'Mike', u'tags': [u'bulk', u'insert']}

            {u'text': u'Good post!', 
             u'_id': ObjectId('544fee5a2d1b111590bf669c'),
             u'author': u'Eliot', u'title': u'MongoDB is fun'}

Mongoengine

    pip install mongoengine
    from mongoengine import *
    

    connect('test')

    class User(Document):
        email = StringField(required=True)
        first_name = StringField(max_length=50)
        last_name = StringField(max_length=50)

Mongoengine

    john = User(email='john@example.com', 
                first_name='John', 
                last_name='Botan').save()

    
    dave = User(email='dave@example.com')
    dave.first_name = 'Dave'
    dave.last_name = 'Last'
    dave.save()

Добавление новых записей

Mongoengine

    for user in User.objects:
        print user.first_name

    
    for user in User.objects(email='good@gmail.com'):
        print user

    
    num_users = User.objects().count()
    

Посмотрим, что у нас получилось

Почему Django + Mongo?

MongoDB можно назвать "pythonic database"

dict ~ JSON

#Python
user = {
    'email': 'john@example.com',
    'first_name': 'John',
    'age': 32
}
// Javascript
user = {
    "email" : "john@example.com", 
    "first_name" : "John",
    "age" : 32
};

Django + MongoDB

Мы будем использовать

MongoEngine

Object-Document Mapper созданный для MongoDB, в стиле Django's ORM 

    pip install mongoengine

Django + MongoDB

Пример модели

    from mongoengine import *
    
    class User(EmbeddedDocument):
        name = StringField(max_length=200)
        age = IntField(default=0)
    
    class UserGroup(Document):
        group_desc = StringField(max_length=200)
        date_created = DateTimeField()
        users = ListField(EmbeddedDocumentField(User))

app/models.py

Django + MongoDB

Как это будет выглядеть со стороны MongoDB

    {
        "_id" : ObjectId("5483165de50c050005e4b29f"),
        "group_desc" : "Python user group",
        "date_created" :  ISODate("2013-04-14T11:06:21.922Z"),
        "users" : [
            {
                "name" : "John Botan",
                "age" : 0
            },
            {
                "choice_text" : "David Rohan",
                "age" : 32
            }
        ],
    }

Django + MongoDB

Что нам может понадобится во view

    from app.models import User, UserGroup
    
    user = User.objects(age=32).first()
    user.age = 25
    print user
    user.save()

    group = UserGroup(group_desc="Go user group")
    group.save()
    
    

app/views.py

Django + MongoDB

Забудьте про ваши базы данных 

    import mongoengine
    
    DATABASES = {
        'default': {
            'ENGINE': '',
        },
    }
    
    SESSION_ENGINE = 'mongoengine.django.sessions' # optional

app/settings.py

Django + MongoDB

Конектимся к MongoDB..

    _MONGODB_USER = 'mongouser'
    _MONGODB_PASSWD = 'password'
    _MONGODB_HOST = 'thehost'
    _MONGODB_NAME = 'thedb'
    _MONGODB_DATABASE_HOST = \
        'mongodb://%s:%s@%s/%s' \
        % (_MONGODB_USER, _MONGODB_PASSWD, _MONGODB_HOST, _MONGODB_NAME)
    
    mongoengine.connect(_MONGODB_NAME, host=_MONGODB_DATABASE_HOST)

app/settings.py

Django + MongoDB

Альтернатива MongoEngine-

 

django-nonrel

Выводы

  • у вас есть жесткие ACID требования
  • у вас уже есть SQL база данных на продакшене  
  • вам необходима наиболее стабильная RDBMS какую вы можете найти

Не используйте MongoDB если:

Выводы

  • вы начинаете новый проект и свободны в выборе
  • ваше приложение работает вокруг  RESTful JSON API
  • у вас есть геопозиционные даные
  • ваше приложение оперирует данными больших обьемов

Смело используйте MongoDB если:

Ваши вопросы?

Докладчик: Зайка Владислав

imressed@gmail.com

+Vladyslav Zaika

Using MongoDB in Python apps

By Vladyslav Zaika

Using MongoDB in Python apps

  • 599