воскресенье, 8 февраля 2009 г.

Полезные штуки: deseb

Здравствуйте, мои дорогие друзья.

Что-то я давно не писал, хотя с последнего раза много интересного произошло:

Сегодня я расскажу о замечательной утилите для Django — deseb.

Deseb добавляет к manage.py всего одну команду evolvedb, эта команда позволяет сгенерировать новую схему базы данных из моделей не теряя данных уже находящихся в базе

Django изначально не умеет этого делать и единственным вариантом изменения схемы является команда resetdb, которая удаляет все таблицы приложения и создает их заново, что согласитесь не очень удобно.

Рассмотрим пример использования команды evolvedb. Для начала нужно установить deseb:

  1. Перейдем в директорию с проектом coblog.
  2. Получим исходные коды deseb
    svn checkout http://deseb.googlecode.com/svn/trunk/src/deseb
  3. И добавим import deseb в начало файла setting.py.

Для примера исправим одну из ошибок в нашем проекте, непозволяющую создавать комментарии без parent и еще пару мелочей. В файле default/models.py заменим

posted = models.DateTimeField()
в модели Post на
posted = models.DateTimeField(blank=True, null=True)
В модели Comment строчку
parent = models.ForeignKey('self')
на
parent = models.ForeignKey('self', null=True, blank=True)
И строчку
__rate = models.IntegerField()
в той же модели на
__rate = models.IntegerField(default=0)

Теперь для изменения базы данных и пригодится команда evolvedb. Запустим ее:

python manage.py evolvedb

… ничего не происходит. Оказалось, что evolvedb не срабатывает на изменение параметров внешних ключей.

Придется немного доработать deseb для того чтобы он воспринимал эти изменения. В файле deseb/schema_evolution.py заменим строчку

if data_types.has_key(data_type):
на строчку
if not f.db_type() is None:

и чудесным образом evolvedb предложит внести изменения в базу.

Я не уверен, что внесенные изменения deseb оправданы и ничего не сломается при работе с другими БД, кто может что сказать по этому поводу?

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

Беспрецедентная акция

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

10 коммент.:

Трам-пам-пам комментирует...

Спасибо большое за заметки, интересно и полезно читать, особенно мне, начинающему.

Анатолий Ларин комментирует...

@Трам-пам-пам, спасибо за отзыв.

bessarabov комментирует...

=) Спасибо за пост и за акцию.

Очень интересно прочитать, как идет процесс разработки, как деплоятся готовые проекты, как исправляются ошибки.

Анатолий Ларин комментирует...

@bessarabov

Разработка идет очень весело, в команде иногда по скраму, не думаю, что здесь можно что-то добавить ;).

Могу рассказать про нашу хитрую систему деплоя она написана на sh скриптах и нарисовать как она завязана на процесс разработки и тестирования. Интересно?

Pizgin комментирует...

Да, было бы здорово!

buriy.com комментирует...

а у меня как одного из создателей спросить? :)
фикс полезный. обязательно добавлю в стабильную версию!

Анатолий Ларин комментирует...

@buriy здорово, спасибо за замечательную утилиту.

Если изменение действительно полезно могу сегодня сформировать патч для транка, протестировать и прислать.

buriy.com комментирует...

применил твоё изменение.
заодно добавил добавление и удаление индексов для постгреса.

Анонимный комментирует...

Спасибо, как раз с базй мучался. Не хотелось данные терять.
А можно узнать как в админке создавать табличные формы для удобного ввода данных по ключу из связанной таблицы? Я имею ввиду что избыточная часть данных будет вводиться автоматически. Хотелось бы увидеть красивое решение по типу inlines
Заранее благодарен

Анатолий Ларин комментирует...

Уже лучше использовать South http://south.aeracode.org/

Про вопрос с админкой не понял, можно подробнее?