ChatGPT解决这个技术问题 Extra ChatGPT

在 Laravel 中回滚一个特定的迁移

我想

仅回滚:

Rolled back: 2015_05_15_195423_alter_table_web_directories

我跑

php artisan migrate:rollback,我的 3 个迁移正在回滚。

Rolled back: 2015_05_15_195423_alter_table_web_directories
Rolled back: 2015_05_13_135240_create_web_directories_table
Rolled back: 2015_05_13_134411_create_contacts_table

我删除

我的 web_directories 和我的 contacts 表都无意中。我从不希望这种情况发生,如果我只能回滚那个特定的,那么这场灾难就永远不会发生。

点赞!只是为了你写这个问题的方式:)
我正在使用 sqlpro,它让我更改了批号,所以我只是更改了编号并回滚
考虑到未来的回滚,使用 'php artisan migrate --step' 逐步运行每个迁移,当您运行 php artisan migrate:rollback 时只会回滚一次迁移

C
Community

Laravel 5.3+

回滚一步。本机。

php artisan migrate:rollback --step=1

这是手册页:docs

Laravel 5.2 及之前版本

没有一些麻烦是没有办法的。有关详细信息,请查看 Martin Bean 的 answer


不过,除非 OP 一直在使用 Laravel 的开发版本编写他的应用程序,否则这没什么用。
这将是一个很好的功能,但它缺少指定要回滚哪些迁移的功能。我假设它只是迁移表中列出的最后一个?当我迁移东西时,我通常不打算回滚,所以我想回滚的迁移是最后一次迁移的机会不是很高。似乎 laravel 有点把球丢在了这个上。我想回滚单个迁移的唯一安全方法是手动编辑迁移表。
@SkeetsO'Reilly 同意,迁移并不是经过深思熟虑的。但是它们在这里,因此您不会从一开始就被迫寻找迁移包。
它就像一个魅力。我正在开发一个新的迁移(向现有表添加一列),然后我看到我使用“uuid”类型迁移,我想要“string”。您的回滚提示效果很好。回滚。更新代码。再次迁移。 => 100% 好的。拉拉维尔 5.7
我如何通过(php artisan)命令行获取我最后的 N 个迁移步骤。如果我愿意,我可以寻求 db 并找到我的迁移表并查询以获取我的历史记录和我上次运行的迁移。但另一方面,我不能总是使用我的迁移文件夹,因为新迁移并不总是排序。对于这个问题,我只是建议我们使用 php artisan make:migration 并且不要使用这些现有文件中间的迁移文件的副本。
M
Martin Bean

如果您查看 migrations 表,您会看到每个迁移都有一个批号。因此,当您回滚时,它会回滚上一批中的每个迁移。

如果您只想回滚最后一次迁移,则只需将批号加一即可。然后,下次您运行 rollback 命令时,它只会回滚该一次迁移,因为它属于自己的“批处理”。

或者,从 Laravel 5.3 开始,你可以运行:

php artisan migrate:rollback --step=1

这将回滚最后一次迁移,无论它的批号是多少。


好推荐!我试图编辑批号,它不会让我。这是一种锁定,并且是灰色的。我在我的 Mac 上的 MySQL WorkBench 中尝试过。有什么想法吗?
你知道为什么,当我尝试配置它们时,我的批号被锁定了吗?
通过如下查询更新迁移表中的批号:UPDATE migrations SET batch=2 WHERE migration='name_of_the_migration';
@ImranKhan 如果您有两个以上的批次,将批次号硬编码为“2”并不是特别好。
使用 Sequel Pro(仅适用于 Mac OS)轻松编辑迁移表并更改批号。
D
Deepak Thomas

最好的方法是创建一个新的迁移并在其中进行必要的更改。

最坏情况的解决方法(如果您有权访问 DB,并且您可以重置该表的数据):

转到数据库并删除/重命名 your-specific-migration 的迁移条目删除由 your-specific-migration 创建的表运行 php artisan migrate --path=/database/migrations/your-specific-migration.php

这将迫使 laravel 运行特定的迁移,因为 Laravel 的迁移历史中不存在关于它的条目

更新:Laravel 方式(谢谢,@thiago-valente)

跑:

php artisan migrate:rollback --path=/database/migrations/your-specific-migration.php

接着:

php artisan migrate

这将重新运行该特定迁移


我用过 php artisan migrate:rollback --path=/database/migrations/your-specific-migration.php 最后是 php artisan migrate
A
Anshul Goyal

每次回滚时,您都会获得最后一批迁移。使用命令

php artisan migrate:rollback --step=1

J
Jignesh Joisar

更好地使用刷新迁移

您可以通过向 refresh 命令提供 step 选项来回滚和重新迁移有限数量的迁移。例如,以下命令将回滚并重新迁移最后两次迁移:

php artisan migrate:refresh --step=2

否则使用回滚迁移

您可以通过向 rollback 命令提供 step 选项来回滚有限数量的迁移。例如,以下命令将回滚最后三个迁移:

php artisan migrate:rollback --step=3

有关迁移的更多详细信息see


laravel中的回滚是什么意思
N
Nehal Hasnayeen

如果您不能按照@Martin Bean 所说的做,那么您可以尝试另一个技巧。

创建一个新的迁移并在该文件上的 up() 方法中插入要回滚的迁移的 down() 方法中的内容,并在 down() 方法中插入 up() 方法中的内容。

例如,如果您的原始迁移是这样的

public function up()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}
public function down()
{
    Schema::drop('users');
}

然后在新的迁移文件中执行此操作

public function up()
{
    Schema::drop('users');
}
public function down()
{
    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id')->unsigned();
        $table->string('name');
    });
}

然后运行迁移,它将删除表。如果你再次想要回滚它。


谢谢你的回答,但我已经准备好了。给你一个快速的问题,你知道为什么我不能编辑我的迁移表的批处理列吗?
@ihue 有点晚了,但您无法使用 UI 编辑它的原因是表迁移没有主键。你必须自己编写 sql 来编辑它。
非常聪明,它做到了我想要的
我认为这是最好的方法。
我喜欢这个,值得一票:) .. 我认为更好的是必须迁移。删除现有表和创建新表的 Ome。第一个将在回滚时重新创建表,第二个将删除新表。
Y
Yvan Rugwe

尝试这个:

php artisan migrate:rollback --step=1

这适用于 Laravel 5.3 +


A
Andre F.

回答这个问题可能有点晚了,但我觉得这是一种非常好的、干净和有效的方法。我会尽量做到彻底。

在创建迁移之前创建不同的目录,如下所示:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

然后,在创建迁移时运行以下命令(以表为例):

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_1

或者

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_2

或者

     php artisan make:migration alter_table_web_directories --path=database/migrations/batch_3

上面的命令将在给定的目录路径中生成迁移文件。然后,您只需运行以下命令即可通过分配的目录迁移文件。

    php artisan migrate alter_table_web_directories --path=database/migrations/batch_1

*注意:您可以将 batch_1 更改为 batch_2 或 batch_3 或您存储迁移文件的任何文件夹名称。只要它保留在 database/migrations 目录或某个指定目录中。

接下来,如果您需要回滚特定的迁移,您可以批量回滚,如下所示:

    php artisan migrate:rollback --step=1
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_1

或者

    php artisan migrate:rollback --step=2
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_2

或者

    php artisan migrate:rollback --step=3
                    or try
php artisan migrate:rollback alter_table_web_directories --path=database/migrations/batch_3

使用这些技术将使您能够更灵活地控制您的数据库以及对您的模式所做的任何修改。


除非 laravel 文档不正确,否则“--step=3”意味着它将回滚最后 3 次迁移,而不是第三次到最后一次迁移运行。我不知道将迁移放在不同的文件夹中是否会改变这一点,但我不希望它改变。如果按名称指定回滚有效,那就太好了!但是,如果您回滚任何参数,它会抱怨“参数太多”。
v
vimuth

如果您有权访问数据库,则可以使用更简单的解决方案。您可以从迁移表中删除记录,然后删除该表。与 SQL 客户端。

或者可以使用

php artisan migrate:rollback --path=... 

像许多答案一样。记住路径是位置。您甚至可以像这样删除模块迁移。 (任何从任何地方迁移)

php artisan migrate:rollback --path=Modules/YourModule/database/migrations/2020_05_15_xxxxxx_create_your_table.php

请记住,如果您使用的是 Linux 服务器,请注意区分大小写。您必须添加 /Database/Migrations 之类的起始资金。

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php

a
atikur rahman

您可以使用

php artisan migrate:rollback --path=/database/migrations/timestamp_filename.php

这将删除该特定迁移。如果文件有外键依赖,我希望你使用 drop 方法。对于这些情况,请尝试创建一个新的迁移并在需要时删除外部文件。


P
Parth kharecha

回滚一步。本机。

php artisan migrate:rollback --step=1

回滚两步。本机。

php artisan migrate:rollback --step=2

R
Raghu Aryan

如果要回滚上次迁移。

php artisan migrate:rollback

如果要回滚特定迁移,请转到迁移表并批量设置该记录的最高值。然后。

php artisan migrate:rollback

目前我正在使用 laravel 5.8,如果不能使用任何其他版本的 laravel,请通知我。


对我有用。上次迁移就是这种情况。
S
Skeets

一张一张地迁移表。

将要回滚的迁移的批号更改为最高。

运行迁移:回滚。

可能不是处理大型项目的最舒适的方式。


S
Shah-Kodes

使用命令“php artisan migrate:rollback --step=1”将迁移回滚到 1 步。

有关更多信息,请查看链接:- https://laravel.com/docs/master/migrations#running-migrations


C
Calos

如果您想修改原始迁移文件并重新迁移,可以使用this package进行迁移。 (适用于 Laravel 5.4 或更高版本)

首先,在你的 Laravel 项目中安装包:

composer require caloskao/migrate-specific

app/Console/Kernel.php 注册命令:

protected $commands = [
    \CalosKao\MigrateSpecific::class
];

现在,运行这个命令来迁移你的文件

php artisan migrate:specific database/migrations/table.php

这可以通过使用 php artisan:migrate --path=database/migrations/my_migration.php 来实现。在您执行此操作之前,请确保 migrations 表没有 my_migration 条目。
K
Kidali Kevin

1.)在数据库内部,前往迁移表并删除与要删除的表相关的迁移条目。

Migration table image example

2.) 接下来,删除与您刚刚从说明 1 中删除的迁移相关的表。

Delete table image example

3.)最后,对您从指令号中删除的表的迁移文件进行您想要的更改。 2 然后运行 php artisan migrate 再次迁移表。


D
David Buck
php artisan migrate:rollback --path=/database/migrations/0000_00_00_0000_create_something_table.php

H
Harry Bosh
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

像这样的东西


P
Paul Roub

作为 stated in the Laravel manual,您可以使用 --step 选项回滚特定数量的迁移

php artisan migrate:rollback --step=5

只有 Laravel 5.3,所以低于该版本的任何代码都不能使用它
这在 OP 的情况下无济于事,因为它将回滚一定数量的迁移,而不是单个指定的迁移。 “--step3”仍将回滚所有 3 个迁移。
W
Wills Manley

如果您需要使用相同的迁移多次执行此操作,则可以替代上述方法。我个人认为这为您的迁移增加了很多灵活性。

database/migrations 添加到 composer.json 中的自动加载对象,如下所示:

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories",
            "database/support",
            "database/migrations" // add this line
        ]
    },

然后将 namespace Database\Migrations; 添加到您的所有迁移文件中。

然后运行 $ composer dump-autoload 以刷新您的 composer.lock 文件。

然后,假设您的迁移类名称是 AlterTableWebDirectories,您可以创建如下命令:

$ php artisan make:command DropAlterTableWebDirectories

并在您的 handle() 方法中编写此逻辑:

public function handle {
   (new AlterTableWebDirectories)->down();
   DB::raw("delete from migrations where migration like '%alter_table_web_directories%'");
}

这将完全符合您的要求。如果您想减少迁移计数而不是删除它,您可能可以弄清楚如何更改 DB:raw 命令。

可以扩展此命令以允许您通过将参数传递给命令来动态选择要删除它的迁移。

然后,当您阅读以再次迁移该文件时,您只需运行 php artisan migrate,它只会迁移该文件。

此过程允许您对迁移进行特定更改,而无需每次都进行完全刷新和播种。

就我个人而言,我需要做很多,因为我的种子相当大。


D
Davide Casiraghi

仅回滚特定迁移非常容易。
由于命令 php artisan migrate:rollback,撤消上一次数据库迁移,迁移执行的顺序存储在 migrations 表的 batch 字段中。

您可以编辑要回滚的迁移的批处理值并将其设置为较高。然后,您可以通过简单的方式回滚该迁移:

php artisan migrate:rollback

编辑相同的迁移后,您可以使用简单的方法再次执行它

php artisan migrate

注意:如果两个或多个迁移具有相同的更高值,它们将同时回滚。