Schema::dropIfExists() 在迁移时删除数据库中的所有表:回滚
Posted
技术标签:
【中文标题】Schema::dropIfExists() 在迁移时删除数据库中的所有表:回滚【英文标题】:Schema::dropIfExists() Deleted ALL tables in DB on migrate:rollback 【发布时间】:2019-10-15 11:22:46 【问题描述】:我在命令行上运行了php artisan migrate:rollback
,所以迁移删除了数据库中的所有表。
只创建了一个迁移,但在使用的数据库中还有其他表。
laravel documentation 说:
要删除现有表,您可以使用
drop
或dropIfExists
方法。
迁移代码上的函数down()
是默认的,如下所示:
public function up()
Schema::create('products', function (Blueprint $table)
$table->bigIncrements('id');
$table->integer('image')->unsigned()->nullable();
$table->string('name', 64);
$table->string('slug', 64)->unique();
$table->integer('price')->unsigned();
$table->timestamps();
);
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
Schema::dropIfExists('products');
我认为Schema::dropIfExists('products')
在这种情况下不能正常工作,这是一个错误吗?还是我(和 laravel 文档)的错误?
【问题讨论】:
还有哪些表?如果您的数据库中有其他表,您应该也为它们进行迁移,并且在这些迁移中,应该有一个调用Schema::drop()
(或dropIfExists()
)的down()
函数。可能需要更多关于此的信息。我不能说我听说过类似的事情发生。
是旧版本的现有数据库。我什至还没有创建其他迁移,因为 db 中有超过 100 个表
【参考方案1】:
回滚,回滚最后一批的每个迁移。
如果您在同一批次中进行所有迁移,那么它将回滚所有迁移。所以你所有的表都会从数据库中删除。
【讨论】:
但是在我的项目中没有其他迁移【参考方案2】:我知道这篇文章已有一年多的历史了,但这可能会对遇到此问题并正在寻找解决方案的其他人有所帮助。我猜这里发生的事情是,如果您运行php artisan migrate:rollback
,它将回滚上一批的所有迁移。换句话说,它将在同一批次的所有迁移中运行所有down()
函数。因此,如果您在那些还原更改(删除创建的表)的迁移中创建了 down()
函数,这些函数也会运行。
为了防止这种情况,您可以添加--step
参数来指示应该回滚多少迁移,例如:php artisan migrate:rollback --step=1
。然后只会回滚您的最后一次迁移。
【讨论】:
以上是关于Schema::dropIfExists() 在迁移时删除数据库中的所有表:回滚的主要内容,如果未能解决你的问题,请参考以下文章