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 说:

要删除现有表,您可以使用dropdropIfExists 方法。

迁移代码上的函数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() 在迁移时删除数据库中的所有表:回滚的主要内容,如果未能解决你的问题,请参考以下文章

Docker 数据目录迁移解决方案

如何在 Laravel 4 中创建 Hstore 列类型?

MySQL中的定义者(definer)的作用

如果我使用 Django South 运行迁移并且它崩溃了,我的数据库是不是曾经损坏?