Запуск 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
метод), а затем добавьте новый столбец и повторно запустите миграцию. Затем вы должны раздавить коммит, чтобы люди не могли оформить немодифицированную миграцию. В общем, было бы проще создать новую миграцию для этого изменения.