Страница 1 из 1

Предложение об улучшении принципа написания миграций

Добавлено: 2017.02.09, 15:13
eXeCUT
Здравствуйте! У меня есть расширение https://github.com/execut/yii2-migration
Там в примере видно, насколько ускоряется и упрощается написание миграций приличной сложности:

Код: Выделить всё

public function initInverter(\execut\yii\migration\Inverter $i)
    {
        $i->table('characteristics')->create(array_merge($this->defaultColumns(), [
            'name' => $this->string()->notNull(),
            'short_name' => $this->string()->notNull(),
        ]));
 
        $i->table('characteristics_units')->create(array_merge($this->defaultColumns(), [
            'name' => $this->string()->notNull(),
        ]))->addForeignColumn('characteristics');
    }
Не понимаю, почему это до сих пор такое отсутствует в ядре yii2 и в любых других библиотеках, а пишутся разные генераторы копи-паста для решения той-же задачи. Моё расширение может работать только с postgresql. В ближайшее время не представляется возможным его допилить до других движков в виду отсутствия времени. А очень хочется поделиться этой идеей с сообществом и иметь подобное в стандартном арсенале yii2. Ликвидировать этот копи-паст, наблюдаемый повсюду. Куда нужно писать и к кому обращаться? И я-бы помог в его доработке в качестве стандартного компонента yii2.

Ещё, возможно, я чего-то не понимаю, либо не знаю. Искал такое в разных фреймворках и языках, нигде не нашёл, может кто знает?

Re: Предложение об улучшении принципа написания миграций

Добавлено: 2017.02.09, 15:34
zelenin
я не понял, что делает-то расширение? добавляет набор дефолтных колонок типа id, create, update?

Re: Предложение об улучшении принципа написания миграций

Добавлено: 2017.02.09, 18:10
eXeCUT
Не только.. Ещё избавляет от 2\3 лишнего кода в миграциях, поскольку избавляет от написания всех обратных операций. Например, добавляем колонку, её нужно дропнуть в safeDown, а расширение это само делает, поскольку умеет инвертировать все операции с БД автоматом. Конкретно в этом примере мы с помощью этого расширения, заменяем кусок кода миграции на более компактный. Она создаёт 2 таблицы со стандартными колонками и ссылкой с одну на другую:

Код: Выделить всё

public function safeUp()
    {
        $this->createTable('characteristics_units', [
            'id' => $this->primaryKey(),
            'name' => $this->string()->notNull(),
            'short_name' => $this->string()->notNull(),
            'created' => $this->dateTime()->notNull()->defaultExpression('now()'),
            'updated' => $this->dateTime(),
        ]);
 
        $this->createTable('characteristics', [
            'id' => $this->primaryKey(),
            'characteristics_unit_id' => $this->integer()->notNull(),
            'name' => $this->string()->notNull(),
            'created' => $this->dateTime()->notNull()->defaultExpression('now()'),
            'updated' => $this->dateTime(),
        ]);
 
        $this->addForeignKey('characteristics_unit_id_characteristics_fk', 'characteristics', 'characteristics_unit_id', 'characteristics_units', 'id');
    }
 
    public function safeDown()
    {
        $this->dropTable('characteristics');
        $this->dropTable('characteristics_units');
    }
а расширение позволяет писать такой код следующим образом:

Код: Выделить всё

public function initInverter(\execut\yii\migration\Inverter $i)
    {
        $i->table('characteristics')->create(array_merge($this->defaultColumns(), [
            'name' => $this->string()->notNull(),
            'short_name' => $this->string()->notNull(),
        ]));
 
        $i->table('characteristics_units')->create(array_merge($this->defaultColumns(), [
            'name' => $this->string()->notNull(),
        ]))->addForeignColumn('characteristics');
    }
Экономия времени написания и объёма кода на лицо

Re: Предложение об улучшении принципа написания миграций

Добавлено: 2017.02.09, 18:15
zelenin
ну выглядит здраво. как на практике, не знаю.

Re: Предложение об улучшении принципа написания миграций

Добавлено: 2017.02.09, 18:19
eXeCUT
Давно это использую. На практике у меня всё в лёт пишется, нежели раньше. Не нужно постоянно держать в голове все обратные операции, которые нужно сделать в откате, ещё и в обратном направлении. Расширение само беспокоится об этом. Было-бы классно такой принцип заложить в стандартных. Ведь по-логике, если в поднятии миграции мы должны что-то сделать, то это реально автоматически и откатить. Зачем это писать? Бывали не стандартные случаи, но там была проблема с правилами именования и какими-то фишками самой БД. Все стандартные операции - легко, для других - старый механизм в дело, up и down не отменяются.

Re: Предложение об улучшении принципа написания миграций

Добавлено: 2017.02.09, 18:30
eXeCUT
Кстати, это расширение и под другие БД легко зашивелится, ведь там всё через стандартные адаптеры идёт, наверное, просто нужно чуток его подпилить в кастомных запросах вроде создания триггеров.

Re: Предложение об улучшении принципа написания миграций

Добавлено: 2017.02.10, 23:07
unclead
уже давненько висит issue на похожую тему: https://github.com/yiisoft/yii2/issues/7928

Re: Предложение об улучшении принципа написания миграций

Добавлено: 2017.02.13, 16:02
eXeCUT
О.. класс.. оказывается есть уже фреймворк на этой идее https://phinx.org/, умеет так:

Код: Выделить всё

    public function change()
    {
        // create the table
        $table = $this->table('user_logins');
        $table->addColumn('user_id', 'integer')
              ->addColumn('created', 'datetime')
              ->create();
    }
Спасибо за наводку! Нужно следить за тасками в yii2, пошёл голосовать за эту идею)