Re[3]: Синхронизация моделей данных
От: Aikin Беларусь kavaleu.ru
Дата: 27.11.12 08:12
Оценка:
Здравствуйте, Shamann, Вы писали:

S>Здравствуйте, mogikanin, Вы писали:


M>>В EntityFramework уже больше года есть Code First Migrations.


S>Согласен, но во-первых, это только одна сторона дела. Если нужно внести в модель классов какие-либо изменения со стороны БД, придется самому создавать классы и маппить их вручную. Во-вторых, основная часть работы по переносу изменений делается вручную. Кроме того, насколько я понял, алгоритм создания миграции задан жестко и не позволяет реализовывать различные стратегии маппинга (ту же структуру из двух классов, один из которых наследуется от другого, можно по-разному отобразить в БД) и сгенеренный вариант миграции все равно правится вручную. Я не говорю о том, что участие пользователя не нужно — полной автоматизации здесь вряд ли можно добиться, но, на мой взгляд, слишком много ручной работы и часть ее можно автоматизировать.

Ну тогда предлагаю глянуть на джанговский south:

South has a few key features:
Automatic migration creation: South can see what’s changed in your models.py file and automatically write migrations that match your changes.
Database independence: As far as possible, South is completely database-agnostic, supporting five different database backends.
App-savvy: South knows and works with the concept of Django apps, allowing you to use migrations for some of your apps and leave the rest to carry on using syncdb.
VCS-proof: South will notice if someone else commits migrations to the same app as you and they conflict.

Чтобы все это заработало в модели нужно хранить много метаданных.
И класический вопрос:
Было:
class Knight(models.Model):
    name = models.CharField(max_length=100)
    of_the_round_table = models.BooleanField()
    dances_whenever_able = models.BooleanField()
    shrubberies = models.IntegerField(null=False)


Стало:
class Knight(models.Model):
    fullname = models.CharField(max_length=100)
    of_the_round_table = models.BooleanField()
    dances_whenever_able = models.BooleanField()
    shrubberies = models.IntegerField(null=False)


Это мы переименовали поле или же удалили старое и создали новое?

СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.