Wednesday, June 24, 2009

Django CouchDB backend 0.1

Не так давно стараниями 42cc была выпущена версия 0.1 бэкенда к CouchDB для Django ORM. Доступ к нему можно получитьна github, также есть трак. Так как я принимал в этом проекте весьма деятельное участие, то мне бы хотелось рассказать про него поподробнее.
Я не буду останавливаться на том, нужна или не нужна CouchDB. Вы можете прочитать об этом здесь или в google. Мне бы хотелось отметить один из недостатков CouchDB - он непривычен для людей, привыкших к реляционным базам данных, а следовательно, может показаться неудобным. Это и стало одной из причин разработки django-couchdb.
Основная цель разработки - позволить описывать взаимодействие приложений на Django с CouchDB на знакомом "языке" - на языке Django ORM. Для поверхностного использования не понадобится даже знания о том, что такое CouchDB - достаточно прописать backend в DATABASE_ENGINE и использовать его. Простейшие примеры того, что умеет django-couchdb(в виде теста):

class Boo(models.Model):
title = models.CharField(max_length=20)
slug = models.SlugField()
class Meta:
unique_together = ('title', 'slug')

class Foo(models.Model):
boo = models.ForeignKey(Boo)
boo2 = models.ForeignKey(Boo, related_name="foo2_set")

b1 = Boo(title="1", slug="1")
b1.save()
b11 = Boo(title="11", slug="1")
b11.save()
b2 = Boo(title="2", slug="2")
b2.save()
f1 = Foo(boo=b1)
f1.save()
f2 = Foo(boo=b2)
f2.save()
f3 = Foo(boo=b1,boo2=b2)
f3.save()
assert_equal(Foo.objects.filter(boo__title="1").count(), 2)
assert_equal(Foo.objects.filter(boo__title="11").count(), 0)
assert_equal(Foo.objects.filter(Q(boo__title="1") | Q(boo__slug="2")).count(), 3)

assert_equal(Foo.objects.filter(Q(boo__title="1") & Q(boo2__title="2")).count(), 1)
assert_equal(Foo.objects.filter(Q(boo__title="1") & Q(boo2__title="11")).count(), 0)

А именно: работает генерация "схемы" из моделей, insert, update, delete, select, joins(не все). Не работает - ManyToManyField, aggregates. Поэтому django.contrib(например, admin) работает, но не полностью.

Перспективы развития

Дальнейшее развитие будет вестись в нескольких направлениях:
  1. Исправление недостатков, поддержка других возможностей ORM
  2. Развитие backend для использования сильных сторон CouchDB
  3. Увеличение производительности

Выводы

Получился очень удобный инструмент, скрывающий особенности реализации (JS, HTTP запросы). Спасибо за внимание, ожидайте новые версии и новые возможности :)

7 comments:

  1. тоже думал в эту сторону

    мысли были в сторону расширения реляционной БД, в которую проецируется ORM, по средством CouchDB

    представлялось наиболее реальным прикрутить её в качестве file storage backend, который бы добавлял к модели специфические особенности, если он является одним из полей этой модели

    ReplyDelete
  2. Как мне кажется, задача написания нереляционного бекэнда интересна только с исследовательской точки зрения. Пользы от притягивания абстракций реляционный модели (которая всё-таки заложена в джанговский ORM) к документо-ориентированной практически нет, за исключением того что может быть поддержано в рабочем состоянии некоторое количество уже имеющихся приложений. Для разработки полноценного проекта с CouchDB, конечно же, нужно кардинально менять подход к хранению данных и архитектуру БЛ.

    ReplyDelete
  3. @Александр Кошелев
    Эта точка зрения известна и принимается во внимание. ;) Практический интерес как раз и заключается в написании и быстром переписывании приложений с реляционных на нереляционный бекенд. И при написании/переписывании будут учитываться уже особенности нереляционных БД. И, ИМХО, Django ORM достаточно абстрактен, чтобы не мешать в этом.

    ReplyDelete
  4. Довольно интересно, но от отсутствия транзакций плохо не будет?

    ReplyDelete
  5. > Довольно интересно, но от отсутствия транзакций плохо не будет?
    backend в процессе развития и написания. Тесты и тикеты приветствуются ;) (ссылка на трак - в посте)

    ReplyDelete
  6. а не могли бы Вы лучше написать, каким образом вы создавали данный backend, а то задумался над этим вопросом (хочу прикрутить redis), но даже не понял, с чего начать и куда смотреть

    ReplyDelete
  7. > а не могли бы Вы лучше написать, каким образом вы создавали данный backend, а то задумался над этим вопросом (хочу прикрутить redis), но даже не понял, с чего начать и куда смотреть

    Почитайте код, думаю, его можно будет адаптировать к любой системе.

    ReplyDelete