<rmcreative>

RSS

Миграции в Yii

30 ноября 2010

Вот и готова ожидаемая многими возможность — миграции.

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

Как происходит типичная работа с миграциями?

Разработчик Андрей создаёт миграцию

yiic migrate create --name=create_news_table

Идёт в protected/migrations и наполняет её полезным кодом:

class m20101129185401_create_news_table extends CDbMigration {
    public function up(){
        $this->createTable('tbl_news', array(
            'id' => 'pk',
            'title' => 'string NOT NULL',
            'content' => 'text',
        ));
    }
 
    /*
    public function down(){
    }
    */
}

Тут можно использовать совершенно любой код, например, зачистить кеш или assets.

Далее Андрей как-то передаёт миграцию Ивану. Через SVN, почтой или по FTP — не важно (лучше, конечно, через систему контроля версий). Иван применяет миграцию:

yiic migrate up

и спокойно работает с новым кодом.

Более подробное описание на русском будет на yiiframework.ru в ближайшее время (ну или, в крайнем случае, перед релизом).

Миграции будут включены в следующий релиз Yii, а пока можно поиграться с trunk-ом. Синтаксис может незначительно поменяться до релиза.

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

  1. №3488
    Serge Bezborodov
    Serge Bezborodov 30 нояб. 2010 г., 23:45:46

    действительно полезная возможность, очень хотелось бы чтобы была хорошо освещена в документации

  2. №3489
    keltanas
    keltanas 30 нояб. 2010 г., 23:54:46

    Хотелось бы, чтобы миграции работали на уровне моделей. В частности AR. Было бы полезно для обновления сайтов на shared-хостингах.

    Грубо говоря, чтобы была возможность закачать модели с обновленными конфигами на сайт, и модели сами прозрачно сравнили состояние таблиц БД с конфигами и обновили списки полей в таблицах, либо создали новые таблицы (ну или то, что требуется).

    Не всегда ведь есть хостинг с SSH ))

  3. №3490
    Sam
    Sam 01 дек. 2010 г., 0:18:12

    Если нет SSH, то на помощь придёт web shell.

  4. №3492
    afunix
    afunix 01 дек. 2010 г., 8:32:08

    Ура! Наконец-то можно будет избавить от корявого расширения! Боюсь, только, релиз 1.1.6 будет не раньше января.

  5. №3493
    medar
    medar 01 дек. 2010 г., 9:07:06

    Это прекрасно ! Спасибо!

  6. №3494
    tipugin
    tipugin 01 дек. 2010 г., 9:13:53

    Ура! Давно ждал! Спасибо!!!

  7. №3495
    xoma
    xoma 01 дек. 2010 г., 9:59:40

    Я правильно понял, что саму "суть" миграции т.е. то, что изменилось - нужно описывать самостоятельно?

  8. №3496
    fduch2k
    fduch2k 01 дек. 2010 г., 10:34:45

    Поддержка добавления/удаления foreign keys не планируется?

  9. №3497
    Ekstazi
    Ekstazi 01 дек. 2010 г., 11:54:16

    xoma, все верно. Мне тоже это не очень нравится. Я обычно меняю напрямую таблицу, а не пишу сперва миграцию. Но одно радует, фреймворк идеет по верному пути, что я еле поспеваю следить за свежими функциями. Если б еще была интеграция миграций с гит или ссх, то будет вообще сказка.

  10. №3498
    tipugin
    tipugin 01 дек. 2010 г., 12:27:19

    xoma, да, описываете необходимые изменения, затем применяете их без ковыряния в базе вручную

  11. №3499
    Ekstazi
    Ekstazi 01 дек. 2010 г., 12:31:22

    Прошу прощения, опечатался, не ссх, а свн.

  12. №3500
    keltanas
    keltanas 01 дек. 2010 г., 12:37:53

    Sam: Если нет SSH, то на помощь придёт web shell.

    А если обновление должен выполнять человек, который вообще не имеет отношения к IT? Для него было бы хорошо просто закачать архив изменений на сайт через форму, и чтобы все заработало ))

    Причем должно быть не важно, в какой версии сейчас находиться сайт на хостинге. И не факт, что там есть какие-то средства настроенной командной строки, SVN и пр. Может у человека просто установлен Денвер и там крутиться сайт, который мы ему сделали на Yii.

    Ну это так, мечты...

  13. №3501
    Sam
    Sam 01 дек. 2010 г., 12:47:41

    Ekstazi, какого рода интеграция? Вешаемся на хук и просто запускаем migrate up при коммите. Или я что-то не понял?

    fduch2k, да.

  14. №3502
    Ekstazi
    Ekstazi 01 дек. 2010 г., 13:31:26

    Sam, Хы, вариант ) Просто я думал по-другому, запускаешь консольную комманду и автоматически коммитится в свн или гит.

  15. №3506
    Konstantin Mirin
    Konstantin Mirin 02 дек. 2010 г., 18:56:25

    Вообще все это выросло из расширения на github: https://github.com/pieterclaerhout/yii-dbmigrations От него был сделан форк и добавили возможность делать Constraints для InnoDB: https://github.com/mintao/yii-dbmigrations

    Ну и я там небольшие фиксы сделал, но они уже в последнем форке есть. Автор изначального расширения pull request не удовлетворяет, неизвестно почему.

    То что это войдет в ядро - это супер, мы юзаем уже сейчас :)

    Лично мы юзаем для того, чтобы можно было на рабочем сервере получить ту же схему БД что и у нас без лишних телодвижений.

  16. №3507
    tuzat
    tuzat 02 дек. 2010 г., 20:18:17

    О,спасибо за добрые новости,а то извините достало то жуткое расширение.

  17. №3510
    Sam
    Sam 02 дек. 2010 г., 22:02:20

    Konstantin Mirin, да, расширение мы, конечно, тоже посмотрели и взяли оттуда несколько идей, но выросли миграции не только из него. Сыграли свою роль миграций RoR и миграции ibatis. Так что в ядро войдёт совсем не тот вариант, что есть в виде расширения.

    Если будут пожелания к функционалу, багфиксы или патчи — обязательно рассмотрим.

    Кстати, сейчас синтаксис команд и внутренности активно меняются. Если что-то не нравится, лучше предлагать сейчас.

  18. №3545
    tipugin
    tipugin 12 дек. 2010 г., 14:46:34

    Хотелось бы видеть функионал добавления индексов, ну и хелперы типа timestamps в RoR. И еще хотелось бы перенести миграции в shell, так имхо удобнее.

  19. №3548
    Sam
    Sam 12 дек. 2010 г., 16:03:56

    Индексы вроде уже в SVN, timestamp тоже. В shell точно переносить не будем — это создаст проблемы для тех, кто хочет автоматизировать применение миграций.

  20. №3550
    tipugin
    tipugin 14 дек. 2010 г., 0:04:47

    индексы нашел в svn, а вот timestamp? просто указывать 'created_at'=>'timestamp'?

  21. №3552
    Sam
    Sam 14 дек. 2010 г., 3:15:57

    Да. Для MySQL список типов такой:

    public $columnTypes=array(
      'pk' => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY',
      'string' => 'varchar(255)',
      'text' => 'text',
      'integer' => 'int(11)',
      'float' => 'float',
      'decimal' => 'decimal',
      'datetime' => 'datetime',
      'timestamp' => 'timestamp',
      'time' => 'time',
      'date' => 'date',
      'binary' => 'blob',
      'boolean' => 'tinyint(1)',
    );
  22. №3561
    tipugin
    tipugin 15 дек. 2010 г., 0:35:26

    а как в конфиге указывать таблицу в которой хранится история миграций.

  23. №3562
    Sam
    Sam 15 дек. 2010 г., 12:06:34
  24. №4564
    Dr0ID
    Dr0ID 08 мая 2011 г., 15:16:01

    Блин почему в Yii очень часто нюансы или важные вещи упущены в документации и приходится лезть в код. Вот как например с $columnTypes.

  25. №4565
    Dr0ID
    Dr0ID 08 мая 2011 г., 15:33:26

    Хотя извиняюсь, в разделе «Построитель запросов» это было написано.

  26. №5756
    Артем
    Артем 16 янв. 2012 г., 3:29:32

    А можно ли в самом теле миграции использовать какую-либо модель?

  27. №5757
    Dr0ID
    Dr0ID 16 янв. 2012 г., 6:14:10

    Артем, можно, но лучше так не делать, чтобы миграции жили своей жизнью и не зависили от кода. Если произойдут какие-то критичные изменения с моделью, миграция не сможет выполнится, а править уже существующую не тру.

    ПС помоему у Сэма была статья на этот счет.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.