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