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

Комментарии 6

  1. u960 написал:

    Нет, и вообще не понимаю всей этой возни вокруг админки. Зато время что потрачено на подпиливание, можно было свою админку написать, я такщитаю.

    Оставлен 22 Январь 2010 в 11:19
  2. http://a.khavr.com/ написал:

    Руки дойдут - доведём до ума. Как сейчас легко видно из дат коммитов - работа остановилась на этапе proof of concept. Админка заработала, что и было достаточным условием.

    А дальше предполагалось допилить его под внутренние проекты @42cc, но у нас с тех пор постоянно не хватает людей.

    Так что, как только потребность в django-couchdb будет вытянута каким-то проектом, так сразу он станет работоспособным.

    Пока что слежу за прогрессом в django-non-relational, где @wkornewald интегрирует поддержку нереляционных баз, в первую очередь GAE.

    Оставлен 22 Январь 2010 в 11:32
  3. pawnhearts написал:

    а вот django-mongodb работал, на первый взгляд нормально, а после обновления джанги из транка(когда они multidb добавили видимо)-перестал

    Оставлен 23 Январь 2010 в 02:34
  4. GrAndSE написал:

    Александр, Вы так классно все расписали о своем решении: что мол и кода мало, и достаточно универсально, и contrib отвалился да не полностью. А можно подробней? Дело в том, что мне вполне возможно предстоит в следующем месяце нечто подобное, а поскольку глубокими знаниями в django похвастаться не могу (практически полнейший новичек), то любая подобная информация может пригодится, а Вы тут о готовом решении :) Был бы очень признателен за описание, код или его куски, или вообще полезные ссылки по теме.

    Оставлен 23 Январь 2010 в 09:28
  5. Александр Кошелев написал:

    Зато время что потрачено на подпиливание, можно было свою админку написать, я такщитаю.

    Вы ошибаетесь.

    Оставлен 23 Январь 2010 в 19:15
  6. Александр Кошелев написал:

    Был бы очень признателен за описание, код или его куски, или вообще полезные ссылки по теме.

    Возможно через какое-то время я выложу код открыто.

    Оставлен 23 Январь 2010 в 19:19

Пингбеки 2

  1. От Все о фильмах » Архив сайта » Не пытайся меня переиграть – Main Khiladi Tu Anari DVD 22 Февраль 2010 в 18:21

    django-couchdb не взлетел | Александр Кошелев | webnewage.org

  2. От Все о фильмах » Архив сайта » Не пытайся меня переиграть – Main Khiladi Tu Anari DVD 22 Февраль 2010 в 18:21

    django-couchdb не взлетел | Александр Кошелев | webnewage.org