Запуск Phinx migrate во второй раз не обновляет базу данных с новой миграцией

Я создал следующую миграцию. Он работает при первом запуске, но если я внесу изменения в миграцию, например добавлю новый столбец, при запуске phinx mingrate -c src/phinx-config.php это не обновляет базу данных.

Похоже, ничего не делать. Если я удалю запись из phinxlog в базе данных, и удалите user таблица будет воссоздавать таблицу. В противном случае никаких изменений не производится.

Если я удалю запись из phinxlog и не удаляйте таблицу, я получаю сообщение об ошибке, что user таблица уже существует Я думал, что это было целью down() так это может уронить стол?

Вот мой код:

<?php

use \StudentApp\Migrations\Migration;

class AppMigration extends Migration
{
   public function up()
   {
       $this->schema->create('users', function(Illuminate\Database\Schema\Blueprint $table) {
           $table->increments('id');
           $table->string('firstname');
           $table->string('lastname');
           $table->string('email');
           $table->string('password');
           $table->string('token');
           $table->timestamp('token_expiry');
           $table->timestamps();
       });
   }

   public function down()
   {
       $this->schema->drop('users');
   }
}

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

1 ответ

Phinx (и большинство других библиотек миграции) не проверяет каждую миграцию на предмет изменений. Phinx проверяет, указана ли временная метка в начале имени файла в таблице phinxlog, и если она еще не существует, то Phinx запустит миграцию.

Итак, когда вы запускаете миграцию в первый раз, Phinx найдет 20161123122600_app_migration.php в папке миграций, и он запустит миграцию up метод и применить изменения там. Затем он добавит 20161123122600 в журнал. Потому что в следующий раз вы запустите migrateФинкс увидит это 20161123122600 уже существует, он просто перейдет к следующему.

Смысл всего этого в том, что, как только ваша миграция перейдет в систему управления версиями, вам не следует изменять миграцию (другие люди могли использовать ее и столкнуться с той же проблемой, с которой вы столкнулись, если они проверят новую версию миграции, которая уже был применен). Лучшее, что нужно сделать, особенно если миграция была перенесена или объединена, - это создать новую миграцию, которая изменяет существующую таблицу (и включает откат, который отменяет изменение).

Если вы еще не отправили изменения, вы можете откатить миграцию (которая вызовет down метод), а затем добавьте новый столбец и повторно запустите миграцию. Затем вы должны раздавить коммит, чтобы люди не могли оформить немодифицированную миграцию. В общем, было бы проще создать новую миграцию для этого изменения.

Другие вопросы по тегам