Фейл С Миграциями

с миграциями только начинаю играться safeUp/safeDown вроде как должны быть безопасными и с транзакциями.

но хотелось бы понять в чем их суть.

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

один из ключей был криво описан и мирграция зафейлилась.

я ожидаю что в таком случае проблемная миграция откатиться, но нет.

таблица и индексы создались, а внешний ключ естественно нет

migrate down преложил откатить последюю успешную миграцию

а после исправления внешнего ключа и migrate опять вывалился в ошибку потому как таблица уже есть в БД

поправьте плиз, где я не правильно понимаю транзакции

Ну во первых в safeDown нужно прописать обратные действия к safeUp. Тоесть если не вышел safeUp то делаешь safeDown и он убирает все те теблицы и ключи которые создались… Дабы при повторном UPe ошибок небыло…

http://www.yiiframework.com/doc/guide/1.1/en/database.migration#transactional-migrations - тут есть хорошее замечание… красным написано, что не все действия попадают под транзакции… некоторые делают неявный коммит.

http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html - вот и список действий которые не попадтю под коммит. И про создание таблиц тут тоже сказанно.

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

понял, но safeDown у меня был описан

или логику надо было в down описывать ?

Можете предосатвить пример? Вообеще down и up можно убрать вообще с миграции и использовать только safe методы… Не надо делать мешанину.

вот заметил что удаления ключей нет, но в принципе удаление таблицы решает и удаление ключей.

или я не прав ?




	public function safeUp()

	{

        $this->createTable(

            'comments',

            array(

                'id'             => "pk",

                'post_id'        => "int NOT NULL",

                'user_id'    	 => "int NOT NULL",

                'title'          => "varchar(255) NOT NULL",

                'image'          => "varchar(255) NOT NULL",

                'created_at'     => "datetime NOT NULL",

            )

        );


		$this->createIndex("ix_comments_post", 'comments', "post_id", false);

		$this->createIndex("ix_comments_user", 'comments', "user_id", false);

        $this->addForeignKey(

            "fk_comments_post_id",

            'comments',

            'post_id',

            'posts',

            'id',

            'CASCADE',

            'CASCADE'

        );

        $this->addForeignKey(

            "fk_comments_user_id",

            'comments',

            'user_id',

            'users',

            'id',

            'CASCADE',

            'CASCADE'

        );

	}


	public function safeDown()

	{

		$this->dropTable('comments');

	}



Да, ключи удаляются при удалении таблицы.

Ну миграция, как по мне, отилчно сделана. Если вдруг в saveUp была ошибка и миграция не дошла до конца но всеже таблица уже создалась то делаешь migration down и все. Ну или на крайний случай, в saveUp, перед созданием таблицы, можешь проверить, есть ли она в БД, сделав это так:


if (Yii::app()->db->schema->getTable($tableName,true)===null) {

    // table does not exist

} else {

    // table exists

}

так дело в том что migrate down предложил не проблемную откатить, а предыдущую.

я вот и не понял тогда что я сделал не так.

Понял. Ну в принципе проблема скорее всего в том, что по факту миграции не расчитаны на "глупо написанные" запросы ну и ошибки не связанные напрямую с БД. Поэтому в ветке разраюотки такое конечно можно допускать но чистить руками прийдется. А вот в ветку продакшена желательно кидать миграции которые пройдут нормально)