我创建了以下迁移。它在我第一次运行时工作,但如果我对迁移进行了更改 - 例如添加新列 - 当我运行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
时数据库未更新的任何想法?
答案 0 :(得分:1)
Phinx(以及大多数其他迁移库)不会检查每次迁移的变化。 Phinx查看文件名开头的时间戳是否列在phinxlog表中,如果它还没有存在,那么Phinx将运行迁移。
因此,当您第一次运行迁移时,Phinx会在迁移文件夹中找到20161123122600_app_migration.php
,它将运行迁移的up
方法并在那里应用更改。然后它会将20161123122600
添加到日志中。因为下次运行migrate
时,Phinx会看到20161123122600
已经存在,它只会转移到下一个。{1}}。
所有这一切的重点在于,一旦您的迁移处于版本控制之中,您就不应该更改迁移(其他人可能已经使用过它,并且如果他们检查出新的迁移,则会遇到相同的问题已应用的迁移版本)。最好的做法是,特别是在推送或合并迁移的情况下,创建一个新的迁移来修改现有的表(并包含一个回滚更改的回滚)。
如果您尚未推送更改,则可以回滚迁移(将调用down
方法),然后添加新列并重新运行迁移。然后,您应该压缩提交,以便人们无法检查未修改的迁移。总而言之,为此更改创建新的迁移会更容易。