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 12345Pymongo
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 mongoengineDjango + 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