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

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Закрыто
eXeCUT
Сообщения: 12
Зарегистрирован: 2016.05.30, 17:48

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

Сообщение 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.

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

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

Сообщение zelenin »

я не понял, что делает-то расширение? добавляет набор дефолтных колонок типа id, create, update?
eXeCUT
Сообщения: 12
Зарегистрирован: 2016.05.30, 17:48

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

Сообщение 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');
    }
Экономия времени написания и объёма кода на лицо
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

ну выглядит здраво. как на практике, не знаю.
eXeCUT
Сообщения: 12
Зарегистрирован: 2016.05.30, 17:48

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

Сообщение eXeCUT »

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

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

Сообщение eXeCUT »

Кстати, это расширение и под другие БД легко зашивелится, ведь там всё через стандартные адаптеры идёт, наверное, просто нужно чуток его подпилить в кастомных запросах вроде создания триггеров.
unclead
Сообщения: 160
Зарегистрирован: 2015.03.13, 19:44

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

Сообщение unclead »

уже давненько висит issue на похожую тему: https://github.com/yiisoft/yii2/issues/7928
eXeCUT
Сообщения: 12
Зарегистрирован: 2016.05.30, 17:48

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

Сообщение 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, пошёл голосовать за эту идею)
Закрыто