Не так давно стараниями 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) работает, но не полностью.
Перспективы развития
Дальнейшее развитие будет вестись в нескольких направлениях:- Исправление недостатков, поддержка других возможностей ORM
- Развитие backend для использования сильных сторон CouchDB
- Увеличение производительности
тоже думал в эту сторону
ReplyDeleteмысли были в сторону расширения реляционной БД, в которую проецируется ORM, по средством CouchDB
представлялось наиболее реальным прикрутить её в качестве file storage backend, который бы добавлял к модели специфические особенности, если он является одним из полей этой модели
Как мне кажется, задача написания нереляционного бекэнда интересна только с исследовательской точки зрения. Пользы от притягивания абстракций реляционный модели (которая всё-таки заложена в джанговский ORM) к документо-ориентированной практически нет, за исключением того что может быть поддержано в рабочем состоянии некоторое количество уже имеющихся приложений. Для разработки полноценного проекта с CouchDB, конечно же, нужно кардинально менять подход к хранению данных и архитектуру БЛ.
ReplyDelete@Александр Кошелев
ReplyDeleteЭта точка зрения известна и принимается во внимание. ;) Практический интерес как раз и заключается в написании и быстром переписывании приложений с реляционных на нереляционный бекенд. И при написании/переписывании будут учитываться уже особенности нереляционных БД. И, ИМХО, Django ORM достаточно абстрактен, чтобы не мешать в этом.
Довольно интересно, но от отсутствия транзакций плохо не будет?
ReplyDelete> Довольно интересно, но от отсутствия транзакций плохо не будет?
ReplyDeletebackend в процессе развития и написания. Тесты и тикеты приветствуются ;) (ссылка на трак - в посте)
а не могли бы Вы лучше написать, каким образом вы создавали данный backend, а то задумался над этим вопросом (хочу прикрутить redis), но даже не понял, с чего начать и куда смотреть
ReplyDelete> а не могли бы Вы лучше написать, каким образом вы создавали данный backend, а то задумался над этим вопросом (хочу прикрутить redis), но даже не понял, с чего начать и куда смотреть
ReplyDeleteПочитайте код, думаю, его можно будет адаптировать к любой системе.