Александр Кошелев
Александр Кошелев Python-разработчик

django-couchdb не взлетел

django-couchdb это ДБ бекэнд для Джанги с поддержкой CouchDB, разработанный командой 42cc.

Начиная новый проект, я очень рассчитывал на это решение, но увы оно совсем не оправдало надежд. Основная цель была, используя CouchDB не отказываться от стандартной джанговской админки и попробовать её заставить работать при помощи это бекэнда. Любовь к админке обусловлена тем, что она уже написана и её не надо изобретать с квадратными колесами нам самим, то что наши контент-менеджеры уже отчасти привыкли к ней и не хочется сбивать им workflow.

Авторы django-couchdb не скрывают что эта их реализация больше академическая и какого-то реального юзкейса у них не было. Что и проявилось в итоге.

Сразу надо сказать, что на данный момент основная гитхабовская ветка не работает с текущей Джангой и свежим CouchDB. Это связано с тем, что в Джанге в последнее время серьезно переработали внутренний API бекэндов баз дынных, а новый CouchDB чуть более строг с структуре документов чем раньше.

Но ладно, завести этот бекэнд вполне можно, что силами Кости Меренкова мы и сделали. Как и предполагалось, заработал базовый ORM, админка, а следовательно и приложения из contrib.

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

Список того что нам не подошло:

  • Для каждой модели создается своя база в CouchDB. Пока не очень понятно, действительно ли это нам так нужно, но у нас все сущности живут в одной базе. Пока один из предполагаемых юзкейсов – имитация классических джоинов известным паттерном. Плюс ещё вопрос психологии и каких-то представлений о том как оно “должно быть”.
  • Для каждой модели есть документ описывающий констрейнты – типа уникальности того или иного поля. Это нужно для мимикрии под стандартное поведение ДБ бекэнда Джанги, но для нас это совсем излишне.
  • Из-за того что по дефолту в CouchDB айдишники документов это хеши, то для того чтобы походить на классический бекэнд, django-couchdb пытается сам генерировать и раздавать возрастающие числовые ключи для документов. Нам это не нужно и тем более в trunk’е CouchDB уже есть механизм переопределения этого дефолтного поведения. CouchDB сам может генерировать числовые идентификаторы.
  • django-couchdb хоть и зависит от couchdb-python библиотеки, но имеющимся там вью-сервером не пользуется и генерирует JavaScript код на лету для временных вьюх. Тут проблема даже не в том, что это JS код, а в том что это при мало-мальски больших объемах данных жутко медленно. Это вообще постулат серьезного использования CouchDB – только постоянные вьюхи работают! Временные исключительно могут пригодится для отладки на малых объемах. У нас данных уже много и поэтому нас такой подход совсем не устраивает.
  • Ну и вообще нам не нужен бекэнд.

Какое-то время мы пытались как-то подтачить этот бекэнд под себя, но в итоге решили от него совсем отказаться. Было очевидно что он для нас действительно избыточен и мы можем попробовать пойти другим путем.

И попробовали. Родилась у нас такая штука, которая позволяет, по средствам написания простого адаптера с оговоренным набором методов, динамически создавать модель, провязывать какую угодно логику для доступа к её объектам и заставить тем самым работать админку.

Поскольку весь код наш и его значительно меньше, то мы решили остаться на ней. Получилось всё очень даже не плохо. Пришлось правда в паре мест применить манкипатчинг, но оно того стоило. Теперь мы имеем простой механизм связывания какого угодно источника данных с джанговской админкой. Кстати, в процессе реализации я окончательно осознал, что админка очень хорошо продуманная система внутри, которая позволяет очень гибко себя изменять.

Что до contrib, то он конечно отвалился. Но не весь и то что нам нужно мы смогли зареюзать.

django-couchdb хороший пример как можно делать бекэнд для нереляционных хранилищ, но у нас он не взлетел. А если учесть не очень специфичные наши требования, то не взлететь он может у многих. Хотя есть шанс довести его до ума и превратить во что-то более реальное. Может попробуете?:-)

comments powered by Disqus