第二次运行Phinx迁移不会使用新迁移

时间:2016-11-23 12:26:50

标签: eloquent phinx

我创建了以下迁移。它在我第一次运行时工作,但如果我对迁移进行了更改 - 例如添加新列 - 当我运行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 个答案:

答案 0 :(得分:1)

Phinx(以及大多数其他迁移库)不会检查每次迁移的变化。 Phinx查看文件名开头的时间戳是否列在phinxlog表中,如果它还没有存在,那么Phinx将运行迁移。

因此,当您第一次运行迁移时,Phinx会在迁移文件夹中找到20161123122600_app_migration.php,它将运行迁移的up方法并在那里应用更改。然后它会将20161123122600添加到日志中。因为下次运行migrate时,Phinx会看到20161123122600已经存在,它只会转移到下一个。{1}}。

所有这一切的重点在于,一旦您的迁移处于版本控制之中,您就不应该更改迁移(其他人可能已经使用过它,并且如果他们检查出新的迁移,则会遇到相同的问题已应用的迁移版本)。最好的做法是,特别是在推送或合并迁移的情况下,创建一个新的迁移来修改现有的表(并包含一个回滚更改的回滚)。

如果您尚未推送更改,则可以回滚迁移(将调用down方法),然后添加新列并重新运行迁移。然后,您应该压缩提交,以便人们无法检查未修改的迁移。总而言之,为此更改创建新的迁移会更容易。