пятница, 18 марта 2011 г.

Краткий обзор ORM для MongoDB на Python

Постепенно интересуясь альтернативами MongoKit, я решил глянуть на альтернативы, и на то, что они предлагают. К сожалению, на данный момент, альтернатив в области Python MongoDB ORM мало, и они, не будем кривить душой, пока слабы. Но даже для их молодости, они уже вполне юзабельны, и могут использоваться. Во многом, здесь заслуга самой MongoDB, и разработчиков PyMongo.

Также хочу отметить, что в посте, интересное найдут либо новички, либо те, кто пока ищут инструменты для работы с MongoDB на Python (хотя думаю, они это найдут и без этого поста), либо кто просто так, со стороны интересуется положением дел. Пост абсолютно не претендует на экспертную оценку, и не описывает подробно достоинства, возможности и недостатки, тех или иных инструментов. Если вы заинтересовались - прошу под кат.

Список самых основных инструментов, которые работают поверх PyMongo, можно найти здесь: PyMongo - Tools.

Я обладая любопытством, решил взглянуть на них. Посмотреть, что они умеют, ну и как реализована работа с ними. В мой список попали, только Schema Free ORM, то есть не подражающие SQL, и не Django-like ORM.

Вот краткий список инструментов, который мне понравился, и которые активно развиваются:

Начну пожалуй с того, с чем имел опыт работы.

MongoKit

Это пожалуй на данный момент самая активно развивающаяся, и наверное самая популярная ORM на данный момент. Активно используется в связке с Pylons. Автор довольно отзывчивый. Документация правда хромает. Она одновременно и вполне полна, но и содержит мало примеров использования. Однако, автор старается ее поддерживать, правда сталкивается с проблемой перевода, который занимает некоторое время (автор француз). Также, автор очень активно общается с пользователями, и довольно активно помогает. Например, у меня был случай, когда я в Juick написал про то, что не нашел способа как удобно регистрировать модели в Flask, этот пост попал в Twitter. Какое же мое было удивление, что автор ответил мне сам, при этом по всей видимости переведя текст моего поста. Тут я снимаю шляпу перед Николасом, побольше таких людей.

Перейду к особенностям. Вся MongoKit строится как надстройка над PyMongo. Многие классы - это всего лишь proxy-объекты над стандартными PyMongo классами.

Структура документа описывается в виде словаря. Поддерживаются многие типы данных, вложенность, autoreference, валидация, индексы, точечная нотация, и даже GridFS (тут я еще раз снимаю шляпу). Также имеется i18n и миграция.

Удобна в использовании, но есть и некоторые минусы, с которыми я столкнулся довольно случайно.

Например, у меня были проблемы с объявлением массивов ссылок на другие документы, и последующим autoreference. Он либо при сохранении получал документ, и сохранял полностью как вложенный, либо таки записывал DBRef, но при получении не использовал autoreference. Или бывало, просто вылетали ошибки. Проблемы как видно, пока что есть, увы.

Из огромных плюсов, по моему личному мнению, является то, что это довольно высокоуровневая надстройка, при этом реализованная на довольно низком уровне. Запросы делаются подобно PyMongo, и используя почти что, синтаксис JS API MongoDB.

Использовать рекомендую, но требуется тестирование работы с базой, так как бывают нюансы.

MongoAlchemy

Проект, вдохновленный самой мощной (насколько я знаю), ORM для SQL - SQLAlchemy. Во многом подражает SQLAlchemy. Те же сессии, те же настройки, декларативный подход к описанию моделей, те же функции для запросов. Посмотрев на документацию, можно сделать вывод, что работать с ней можно, по идее autoreference должен поддерживать.

Для разработчиков, ранее работавших с SQLAlchemy или Django ORM будет очень привычна. При этом радует, что не ограничивает модели табличной структурой.

Ming

ORM похожая на MongoAlchemy. Я бы сказал даже очень похожая. Проекту уже где то год-два. На данный момент в разработке версия 0.2. Самая плохая документация из всех. Отчасти, по всей видимости, благодаря тому, что разработчикам просто лень было копировать документацию с PyMongo. Насколько, я смог понять, многие функции там просто являются proxy к функциям PyMongo, причем напрямую. Есть поддержка миграции.

Думаю проект удачный, но все таки по первому взгляду отстает от MongoAlchemy.

Интересной особенностью, является возможность использования хранилища в оперативной памяти. Но насколько я понял, это лишь имитация поведения MongoDB, которую аккуратно привязали к Ming.

pymongo-bongo

Трудно назвать это ORM. Это скорее всего синтаксический сахар к PyMongo. В частности, это касается dot notation в документах, вместо стандартного способа доступа к элементам, как в словаре. Если используется чистый PyMongo, то по мне, так лучше использовать эту обертку. Сильно производительность не упадет, а вот более читаемый и удобный код будет плюсом. Все таки удобнее читать поля объекта, а не поля словаря в синтаксисе Python, или к примеру в шаблонах.

Краткий вывод

Прежде, чем напишу свой краткий вывод, хочу сказать несколько вещей:

  • Проблемы, с которыми я столкнулся в MongoKit, могут быть не проблемой самой MongoKit, а вполне вероятно, что это мои кривые руки.
  • Насчет MongoAlchemy и Ming - я очень хочу попробовать их в использовании, и в частности написать пару демо для проверки того, как они работают в тех задачах, где я встретил сложности в MongoKit. Ну и декларативное описание, так же по мне чуть удобнее в смысле привычности (web программированием на Python, я начал заниматься с Django).

Ну и собственно вывод: MongoDB сейчас активно развивается, вот буквально вчера вышла новая версия 1.8, много новых вкусных вещей, ребята очень хорошо делают свой продукт, и я всей душой с ними. Честно. Продукт молодой, но успехи, которые они делают, очень меня радуют. Спасибо им, за их продукт.

Очень радуют разработчики PyMongo. Спасибо им, за их классный драйвер, который сейчас поддерживает весь функционал MongoDB, спасибо им за удобный API, и вообще классный инструмент, который можно использовать даже без ORM, и вполне легко.

И радует положение вещей в отношении MongoDB ORM. Да. Пока есть проблемы, пока слабо, пока не тот уровень, который очень хотелось бы. Но для проектов, которые связаны с не менее молодым продуктом - это огромные семимильные шаги, и то, что они делаются не может не радовать.

Особо радует, разработчик MongoKit, и если бы было больше таких людей - то open source, да и думаю весь IT был бы куда лучше и теплее.

Что касается MongoAlchemy и Ming, то я хочу завтра же попробовать их в действии, как они будут себя вести. И если все получится удачно, то отпишу пост о испытании.