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/