Spec-Zone.ru › Flask 0.12

MongoKit во Flask

Использование документо-ориентированной базы данных вместо полноценной СУБД становится все более распространенным в наши дни. Этот шаблон показывает, как использовать MongoKit, библиотеку для работы с документо-ориентированными базами данных, для интеграции с MongoDB.

Для этого шаблона требуется запущенный сервер MongoDB и установленная библиотека MongoKit.

Существует два очень распространенных способа использования MongoKit. Я опишу каждый из них здесь:

Декларативный

Поведение MongoKit по умолчанию является декларативным, основанным на общих идеях из Django или расширения SQLAlchemy declarative.

Вот пример app.py модуля для вашего приложения:

from flask import Flask
from mongokit import Connection, Document

# configuration
MONGODB_HOST = 'localhost'
MONGODB_PORT = 27017

# create the little application object
app = Flask(__name__)
app.config.from_object(__name__)

# connect to the database
connection = Connection(app.config['MONGODB_HOST'],
                        app.config['MONGODB_PORT'])

Чтобы определить ваши модели, просто создайте подкласс класса Document, который импортируется из MongoKit. Если вы видели шаблон SQLAlchemy, вам может быть интересно, почему у нас нет сессии и даже не определена функция init_db здесь. С одной стороны, в MongoKit нет ничего подобного сессии. Это иногда делает написание кода более многословным, но также делает его невероятно быстрым. С другой стороны, MongoDB является беcхемовой. Это означает, что вы можете изменять структуру данных от одного запроса на вставку к следующему без каких-либо проблем. MongoKit также является беcхемовым, но реализует некоторую валидацию для обеспечения целостности данных.

Вот пример документа (поместите это также в app.py, например):

from mongokit import ValidationError

def max_length(length):
    def validate(value):
        if len(value) <= length:
            return True
        # must have %s in error format string to have mongokit place key in there
        raise ValidationError('%s must be at most {} characters long'.format(length))
    return validate

class User(Document):
    structure = {
        'name': unicode,
        'email': unicode,
    }
    validators = {
        'name': max_length(50),
        'email': max_length(120)
    }
    use_dot_notation = True
    def __repr__(self):
        return '<User %r>' % (self.name)

# register the User document with our current connection
connection.register([User])

Этот пример показывает, как определить вашу схему (именованную структуру), валидатор для максимальной длины символов и использует специальную функцию MongoKit, называемую use_dot_notation. По умолчанию MongoKit ведет себя как словарь Python, но с use_dot_notation установленным в True, вы можете использовать ваши документы так же, как вы используете модели практически в любой другой ORM, используя точки для разделения атрибутов.

Вы можете вставлять записи в базу данных следующим образом:

>>> from yourapplication.database import connection
>>> from yourapplication.models import User
>>> collection = connection['test'].users
>>> user = collection.User()
>>> user['name'] = u'admin'
>>> user['email'] = u'admin@localhost'
>>> user.save()

Обратите внимание, что MongoKit довольно строг в отношении используемых типов столбцов, вы не должны использовать общий тип str ни для name, ни для email, а только unicode.

Запросы также просты:

>>> list(collection.User.find())
[<User u'admin'>]
>>> collection.User.find_one({'name': u'admin'})
<User u'admin'>

Уровень совместимости PyMongo

Если вы просто хотите использовать PyMongo, вы можете сделать это и с MongoKit. Вы можете использовать этот процесс, если вам нужна максимальная производительность. Обратите внимание, что этот пример не показывает, как связать его с Flask, см. приведенный выше код MongoKit для примеров:

from MongoKit import Connection

connection = Connection()

Для вставки данных вы можете использовать метод insert. Сначала нам нужно получить коллекцию, это во многом то же самое, что и таблица в мире SQL.

>>> collection = connection['test'].users
>>> user = {'name': u'admin', 'email': u'admin@localhost'}
>>> collection.insert(user)

MongoKit автоматически выполнит фиксацию для нас.

Чтобы выполнить запрос к вашей базе данных, используйте коллекцию напрямую:

>>> list(collection.find())
[{u'_id': ObjectId('4c271729e13823182f000000'), u'name': u'admin', u'email': u'admin@localhost'}]
>>> collection.find_one({'name': u'admin'})
{u'_id': ObjectId('4c271729e13823182f000000'), u'name': u'admin', u'email': u'admin@localhost'}

Эти результаты также являются объектами, похожими на словари:

>>> r = collection.find_one({'name': u'admin'})
>>> r['email']
u'admin@localhost'

Для получения дополнительной информации о MongoKit перейдите на сайт.

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/0.12.x/patterns/mongokit/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API