Laravelで特定の1つの移行をロールバックする


238

が欲しいです

ロールバックのみ:

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テーブルの両方が意図せずに。それが起こらないようにしたいし、その特定のものだけをロールバックできれば、この災害は起こらないだろう。


46
賛成投票!ちょうどあなたがこの質問を書いた方法のために:)
Sliq

私はsqlproを使用していますが、バッチ番号を変更できるので、番号を変更してロールバックしました
ロール

今後のロールバックを考慮して、「php artisan migrate --step」を使用して各移行を段階的に実行します。これにより、php artisan migrate:rollbackを実行したときに1つの移行のみがロールバックされます
James

回答:


146

migrationsテーブルを見ると、各移行にバッチ番号があることがわかります。したがって、ロールバックすると、最後のバッチの一部であった各移行がロールバックされます。

最後の移行のみをロールバックする場合は、バッチ番号を1だけ増やします。その後、次にrollbackコマンドを実行したときに、それ自体の「バッチ」内にあるため、その1つのマイグレーションのみがロールバックされます。


良いお勧め!バッチ番号を編集しようとしたのですが、できません。それは一種のロックであり、グレーアウトしています。私はMacのMySQL WorkBenchでそれを試しました。それについて何か考えはありますか?
cyber8200

なぜ私がそれらを構成しようとしたときに私のバッチ番号がロックされているのか知っていますか?
cyber8200

1
次のようなクエリでマイグレーションテーブルのバッチ番号を更新します。UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan

3
@ImranKhanバッチ番号を「2」にハードコーディングすることは、3つ以上のバッチがある場合、特に優れているわけではありません。
Martin Bean

Sequel Pro(Mac OSのみ)を使用して、移行テーブルを簡単に編集し、バッチ番号を変更します。
Arslan Ramay

271

Laravel 5.3以降

1ステップをロールバックします。ネイティブ。

php artisan migrate:rollback --step=1

そして、これがマニュアルページです:docs


Laravel 5.2以前

いくつかの手間なしに行う方法はありません。詳細については、Martin Beanの回答を確認してください。


1
OPが開発中のバージョンのLaravelを使用してアプリケーションを作成していない限り、役に立ちません。
Martin Bean

4
これは良い機能ですが、どのマイグレーションをロールバックするかを指定する機能がありません。私はそれがマイグレーションの表にリストされている最後のものだけであると思いますか?物事を移行するときは、通常、ロールバックする予定はないので、ロールバックしたい移行が最後の移行になる可能性はあまり高くありません。ララヴェルがボールを落としたみたいです。単一の移行をロールバックする唯一の安全な方法は、移行テーブルを手動で編集することだと思います。
スキート2016

@ SkeetsO'Reillyは同意し、移行はあまりよく考えられていません。しかし、これらはここにあるため、最初から移行パッケージを探す必要はありません。
Yauheni Prakopchyk

それは魅力のように働きました。私は新しい移行(既存のテーブルに列を追加する)を開発していて、 "uuid"タイプで移行したのを見ました。 "string"が必要でした。ロールバックのヒントは完全に機能しました。ロールバック。コードを更新します。もう一度移行します。=> 100%OK。Laravel 5.7
Florian Doyen

(php artisan)コマンドラインで最後のN個の移行手順を取得するにはどうすればよいですか。必要に応じて、dbを探し、移行テーブルとクエリを見つけて、実行した履歴と最後の移行をフェッチできます。しかし、一方で、新しいマイグレーションが常にソートされるわけではないため、マイグレーションフォルダーを常に使用することはできません。この問題については、php artisan make:migrationを使用し、移行ファイルのコピーを既存のファイルの中央から使用しないことをお勧めします。
saber tabatabaee yazdi

24

ロールバックするたびに、移行の最後のバッチを取得します。コマンドを使用する

php artisan migrate:rollback --step=1

18

@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');
    });
}

次に移行を実行すると、テーブルが削除されます。もう一度やり直したい場合は、ロールバックしてください。


回答ありがとうございます。これで問題ありません。簡単な質問ですが、移行テーブルのバッチ列を編集できないのはなぜですか。
cyber8200

1
@ihue少し遅れますが、UIを使用して編集できない理由は、テーブルの移行に主キーがないためです。自分で編集するには、SQLを記述する必要があります。
Vic

15

リフレッシュ移行を使用する方が良い

更新コマンドにステップオプションを指定することで、限られた数の移行をロールバックして再移行できます。たとえば、次のコマンドは、最後の2つの移行をロールバックして再移行します。

php artisan migrate:refresh --step=2

それ以外の場合はロールバック移行を使用

rollbackコマンドにstepオプションを指定することで、限られた数の移行をロールバックできます。たとえば、次のコマンドは最後の3つの移行をロールバックします。

php artisan migrate:rollback --step=3

移行の詳細については、


11

最善の方法は、新しい移行を作成し、それに必要な変更を加えることです。

最悪の場合の回避策(あればあなたは、DBへのアクセス権を持ってプラスあなたはそのテーブルのデータのRESETで大丈夫です):

  1. DBに移動し、移行エントリを削除 /名前変更しますyour-specific-migration
  2. ドロップで作成されたテーブルをyour-specific-migration
  3. 走る 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

これにより、特定の移行が再実行されます


4
私はphp artisan migrate:rollback --path=/database/migrations/your-specific-migration.php最後に 使用しました php artisan migrate
チアゴヴァレンテ

8

この質問に答えるのは少し遅いかもしれませんが、ここで私が感じていることを実行するための非常に優れた、クリーンで効率的な方法を紹介します。できる限り徹底するようにします。

マイグレーションを作成する前に、次のように別のディレクトリを作成します。

    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に変更したり、移行ファイルを保存するフォルダ名を変更したりできます。データベース/ 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回のマイグレーションではなく最後の3回のマイグレーションをロールバックすることを意味します。別のフォルダーに移行を配置することでそれがまったく変わるかどうかはわかりませんが、そうなるとは思いません。名前でロールバックを指定できれば、それはすばらしいことです。ただし、引数をロールバックすると、「引数が多すぎます」というメッセージが表示されます。
スキート2016

4

1ステップをロールバックします。ネイティブ。

php artisan migrate:rollback --step=1

2ステップをロールバックします。ネイティブ。

php artisan migrate:rollback --step=2


4

最後の移行をロールバックする場合。

php artisan migrate:rollback

特定の移行をロールバックする場合は、移行テーブルに移動して、そのレコードの最大値をバッチで設定します。その後。

php artisan migrate:rollback

現在、私はlaravel 5.8に取り組んでいます。他のバージョンのlaravelが機能しない場合は、お知らせください。


私にとっては役に立ちました。前回の移行ではまさにそのようなケースです。
CodeToLife

3

テーブルを1つずつ移行します。

ロールバックする移行のバッチ番号を最高に変更します。

migrate:rollbackを実行します。

大規模なプロジェクトに対処するには、最も快適な方法とは言えません。


3

元の移行ファイルを変更して再度移行する場合は、このパッケージを使用して移行できます。(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
Aleksandar

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

このようなもの


1

1.)データベース内で、移行テーブルに移動し、削除するテーブルに関連する移行のエントリを削除します。

移行テーブル画像の例

2.)次に、手順1で削除した移行に関連するテーブルを削除します。

テーブル画像の削除例

3.)最後に、手順番号から削除したテーブルの移行ファイルに必要な変更を加えます。2を実行php artisan migrateして、テーブルを再度移行します。


0

以下のようLaravelのマニュアルに記載されている、あなたが使用して移行の特定の番号をロールバックすることが--stepオプションを

php artisan migrate:rollback --step=5

Laravel 5.3のみなので、そのバージョンより下でコーディングされたものは使用できません
Jeffz

これはOPの場合には役に立ちません。指定された単一の移行ではなく、特定の数の移行をロールバックするためです。「--step3」は3つの移行すべてをロールバックします。
スキート2016

0

同じ移行でこれを何度も行う必要がある場合は、前述の方法の別の方法です。個人的には、これにより移行に多くの柔軟性が追加されると思います。

このようdatabase/migrationsにあなたのautoloadオブジェクトに追加してください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のみが移行されます。

このプロセスにより、毎回完全な更新とシードを行わなくても、移行に特定の変更を加えることができます。

私の種子はかなり大きいので、個人的に私はそれをたくさんする必要があります。


0
php artisan migrate:rollback --path=/database/migrations/0000_00_00_0000_create_something_table.php

0

DBにアクセスできる場合は、より簡単な解決策があります。移行テーブルからレコードを削除して、テーブルを削除することができます。SQLクライアントで。

そして使用できます

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

多くの答えのように。パスが場所であることを忘れないでください。このようなモジュールの移行も削除できます。(anywhareからの移行)

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.