Rollback einer bestimmten Migration in Laravel

238

Ich will

nur zum Rollback:

Rolled back: 2015_05_15_195423_alter_table_web_directories


ich renne

php artisan migrate:rollback, 3 meiner Migration rollen zurück.

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

Ich lösche

sowohl mein web_directoriesals auch mein contactsTisch ungewollt. Ich möchte nie, dass das passiert, und wenn ich nur diesen einen bestimmten Rollback durchführen kann, wird diese Katastrophe niemals passieren.

cyber8200
quelle
46
upvote! Nur für die Art, wie Sie diese Frage geschrieben haben :)
Sliq
Ich benutze sqlpro, es hat mich die Chargennummer ändern lassen, also habe ich nur die Nummer geändert und nur zurückgesetzt
roll
In Anbetracht zukünftiger Rollbacks verwenden Sie 'php artisan migrate --step', um jede Migration Schritt für Schritt auszuführen. Dabei wird nur eine Migration zurückgesetzt, wenn Sie php artisan migrate ausführen: rollback
James

Antworten:

146

Wenn Sie in Ihre migrationsTabelle schauen , sehen Sie, dass jede Migration eine Chargennummer hat. Wenn Sie also ein Rollback durchführen, wird jede Migration, die Teil des letzten Stapels war, zurückgesetzt.

Wenn Sie nur die letzte Migration zurücksetzen möchten, erhöhen Sie einfach die Chargennummer um eins. Wenn Sie den rollbackBefehl das nächste Mal ausführen , wird nur diese eine Migration zurückgesetzt, da sie sich in einem eigenen „Stapel“ befindet.

Martin Bean
quelle
Gute Empfehlung! Ich habe versucht, die Chargennummer zu bearbeiten, es lässt mich nicht. Es ist eine Art Schloss und grau. Ich habe das in MySQL WorkBench auf meinem Mac versucht. Irgendeine Idee dazu?
Cyber8200
Wissen Sie warum, meine Chargennummer ist gesperrt, als ich versuchte, sie zu konfigurieren?
Cyber8200
1
Aktualisieren Sie die Chargennummer in der Migrationstabelle wie folgt : UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan
3
@ImranKhan Die Hardcodierung der Chargennummer auf '2' ist nicht besonders gut, wenn Sie mehr als zwei Chargen haben.
Martin Bean
Verwenden Sie Sequel Pro (nur für Mac OS), um Ihre Migrationstabelle einfach zu bearbeiten und Chargennummern zu ändern.
Arslan Ramay
271

Laravel 5.3+

Rollback einen Schritt. Nativ.

php artisan migrate:rollback --step=1

Und hier ist die Handbuchseite: docs .


Laravel 5.2 und früher

Keine Möglichkeit, ohne Ärger auszukommen. Weitere Informationen finden Sie in der Antwort von Martin Bean .

Yauheni Prakopchyk
quelle
1
Nicht nützlich, es sei denn, das OP hat seine Anwendung mit der in der Entwicklung befindlichen Version von Laravel geschrieben.
Martin Bean
4
Dies wäre eine gute Funktion, aber es fehlt die Funktionalität, um anzugeben, welche der Migrationen zurückgesetzt werden sollen. Ich nehme an, es ist nur die letzte in der Migrationstabelle aufgeführt? Wenn ich Dinge migriere, plane ich normalerweise kein Rollback, daher sind die Chancen, dass die Migration, die ich zurücksetzen möchte, die letzte Migration ist, nicht sehr hoch. Scheint, als hätte Laravel den Ball auf diesen fallen lassen. Der einzig sichere Weg, eine einzelne Migration zurückzusetzen, besteht vermutlich darin, die Migrationstabelle manuell zu bearbeiten.
Skeets
@ SkeetsO'Reilly Einverstanden, Migrationen sind nicht sehr gut durchdacht. Aber sie sind hier, damit Sie nicht von Anfang an nach einem Migrationspaket suchen müssen.
Yauheni Prakopchyk
Es funktionierte wie ein Zauber. Ich habe eine neue Migration entwickelt (eine Spalte zu einer vorhandenen Tabelle hinzugefügt) und dann gesehen, dass ich mit dem Typ "uuid" migriert bin. Ich wollte "string". Ihr Rollback-Tipp hat perfekt funktioniert. Rollback. Code aktualisieren. Migrieren Sie erneut. => 100% ok. Laravel 5.7
Florian Doyen
Wie kann ich meine letzten N Migrationsschritte über die Befehlszeile (php artisan) abrufen? Wenn ich möchte, kann ich versuchen, eine Datenbank zu erstellen und meine Migrationstabelle und Abfrage zu finden, um meinen Verlauf und meine letzte Migration abzurufen, die ausgeführt wird. Andererseits kann ich meinen Migrationsordner nicht immer verwenden, da die neue Migration nicht immer sortiert ist. Für dieses Problem empfehle ich nur, dass wir PHP Artisan Make: Migration verwenden und keine Kopie der Migrationsdateien aus der Mitte dieser vorhandenen Dateien verwenden.
Säbel tabatabaee yazdi
24

Bei jedem Rollback erhalten Sie den letzten Migrationsstapel. Verwenden Sie den Befehl

php artisan migrate:rollback --step=1
PAUL KIARIE
quelle
18

Wenn Sie nicht tun können, was @Martin Bean sagt, können Sie einen anderen Trick ausprobieren.

Erstellen Sie eine neue Migration und fügen Sie in diese Datei in der up () -Methode ein, was in der down () -Methode der Migration ist, die Sie zurücksetzen möchten, und in der down () -Methode, was in der up () -Methode eingefügt wird.

zB wenn Ihre ursprüngliche Migration so ist

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

Dann tun Sie dies in einer neuen Migrationsdatei

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

Wenn Sie dann die Migration ausführen, wird die Tabelle gelöscht. und wenn Sie das wieder zurück wollen, rollen Sie es einfach zurück.

Nehal Hasnayeen
quelle
Vielen Dank für Ihre Antwort, aber ich bin damit fertig. Kurze Frage an Sie, wissen Sie, warum ich die Batch-Spalte meiner Migrationstabelle nicht bearbeiten kann?
Cyber8200
1
@ihue etwas spät, aber der Grund, warum Sie es nicht über die Benutzeroberfläche bearbeiten können, ist, dass die Tabellenmigrationen keinen Primärschlüssel haben. Sie müssen die SQL schreiben, um sie selbst zu bearbeiten.
Vic
15

besser zu verwenden aktualisieren aktualisieren migrieren

Sie können eine begrenzte Anzahl von Migrationen zurücksetzen und erneut migrieren, indem Sie die Schrittoption für den Aktualisierungsbefehl bereitstellen. Mit dem folgenden Befehl werden beispielsweise die letzten beiden Migrationen zurückgesetzt und erneut migriert:

php artisan migrate:refresh --step=2

ansonsten verwendete Rollback-Migration

Sie können eine begrenzte Anzahl von Migrationen zurücksetzen, indem Sie die Schrittoption für den Rollback-Befehl bereitstellen. Mit dem folgenden Befehl werden beispielsweise die letzten drei Migrationen zurückgesetzt:

php artisan migrate:rollback --step=3

Weitere Informationen zur Migration finden Sie unter

Jignesh Joisar
quelle
11

Am besten erstellen Sie eine neue Migration und nehmen die erforderlichen Änderungen vor.

Problemumgehung im schlimmsten Fall ( wenn Sie Zugriff auf DB Plus haben, können Sie die Daten dieser Tabelle zurücksetzen ):

  1. Gehen Sie zur Datenbank und löschen / benennen Sie den Migrationseintrag für umyour-specific-migration
  2. Löschen Sie die von erstellte Tabelleyour-specific-migration
  3. Lauf php artisan migrate --path=/database/migrations/your-specific-migration.php

Dadurch wird Laravel gezwungen, diese bestimmte Migration auszuführen, da in der Migrationshistorie von Laravel kein Eintrag darüber vorhanden ist

UPDATE : Der Laravel-Weg (Danke, @ thiago-valente)

Lauf:

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

und dann:

php artisan migrate

Dadurch wird diese bestimmte Migration erneut ausgeführt

Deepak Thomas
quelle
4
Ich habe php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpUnd schließlich php artisan migrate
Thiago Valente
8

Es mag etwas spät sein, diese Frage zu beantworten, aber ich denke, hier ist eine sehr gute, saubere und effiziente Möglichkeit, dies zu tun. Ich werde versuchen, so gründlich wie möglich zu sein.

Erstellen Sie vor dem Erstellen Ihrer Migrationen verschiedene Verzeichnisse wie folgt:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Führen Sie dann beim Erstellen Ihrer Migrationen den folgenden Befehl aus (am Beispiel Ihrer Tabellen):

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

oder

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

oder

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

Mit den obigen Befehlen wird die Migrationsdatei innerhalb des angegebenen Verzeichnispfads erstellt. Anschließend können Sie einfach den folgenden Befehl ausführen, um Ihre Dateien über die ihnen zugewiesenen Verzeichnisse zu migrieren.

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

* Hinweis: Sie können batch_1 in batch_2 oder batch_3 oder einen beliebigen Ordnernamen ändern, in dem Sie die Migrationsdateien speichern. Solange dieser im Datenbank- / Migrationsverzeichnis oder in einem bestimmten Verzeichnis verbleibt.

Wenn Sie Ihre spezifischen Migrationen zurücksetzen müssen, können Sie wie unten gezeigt einen Stapel zurücksetzen:

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

oder

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

oder

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

Die Verwendung dieser Techniken ermöglicht Ihnen mehr Flexibilität und Kontrolle über Ihre Datenbank (en) und alle an Ihrem Schema vorgenommenen Änderungen.

Andre F.
quelle
Sofern die Laravel-Dokumentation nicht falsch ist, bedeutet "--step = 3", dass die letzten 3 Migrationen zurückgesetzt werden, nicht der vorletzte Migrationslauf. Ich weiß nicht, ob das Ablegen der Migrationen in verschiedenen Ordnern das überhaupt ändern würde, aber ich würde es nicht erwarten. Wenn die Angabe des Rollbacks nach Namen funktioniert, wäre das großartig! Wenn Sie jedoch Argumente zurücksetzen, werden "zu viele Argumente" beanstandet.
Skeets
4

Rollback einen Schritt. Nativ.

php artisan migrate:rollback --step=1

Rollback in zwei Schritten. Nativ.

php artisan migrate:rollback --step=2
Parth Kharecha
quelle
4

Wenn Sie die letzte Migration rückgängig machen möchten.

php artisan migrate:rollback

Wenn Sie eine bestimmte Migration rückgängig machen möchten, wechseln Sie zur Migrationstabelle und legen Sie den höchsten Wert dieses Datensatzes im Stapel fest. Dann.

php artisan migrate:rollback

Derzeit arbeite ich an Laravel 5.8. Wenn ich keine andere Version von Laravel arbeite, informieren Sie mich bitte.

Raghu Aryan
quelle
war nützlich für mich. Genau so ein Fall bei der letzten Migration.
CodeToLife
3

Migrieren Sie Tabellen nacheinander.

Ändern Sie die Chargennummer der Migration, für die Sie ein Rollback durchführen möchten, auf die höchste.

Führen Sie migrate: rollback aus.

Möglicherweise nicht die bequemste Art, größere Projekte zu bearbeiten.

Jeffz
quelle
3

Wenn Sie die ursprüngliche Migrationsdatei ändern und erneut migrieren möchten, können Sie dieses Paket zum Migrieren verwenden. (Gilt für Laravel 5.4 oder höher)

Installieren Sie zunächst das Paket in Ihrem Laravel-Projekt:

composer require caloskao/migrate-specific

Registrieren Sie den Befehl unter app/Console/Kernel.php:

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

Führen Sie nun diesen Befehl aus, um Ihre Datei zu migrieren

php artisan migrate:specific database/migrations/table.php
Calos
quelle
Dies kann durch Verwendung erreicht werden php artisan:migrate --path=database/migrations/my_migration.php. Stellen Sie kurz bevor Sie dies tun, sicher, dass die migrationsTabelle keinen Eintrag für hat my_migration.
Aleksandar
1
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

etwas wie das

Harry Bosh
quelle
1

1.) Gehen Sie in der Datenbank zur Migrationstabelle und löschen Sie den Eintrag der Migration, der sich auf die Tabelle bezieht, die Sie löschen möchten.

Beispiel für ein Migrationstabellenbild

2.) Löschen Sie als Nächstes die Tabelle, die sich auf die Migration bezieht, die Sie gerade aus Anweisung 1 gelöscht haben.

Beispiel für ein Tabellenbild löschen

3.) Nehmen Sie abschließend die gewünschten Änderungen an der Migrationsdatei der Tabelle vor, die Sie aus Anweisung Nr. 1 gelöscht haben. 2 Führen Sie dann aus php artisan migrate, um die Tabelle erneut zu migrieren.

Kidali Kevin
quelle
0

Wie im Laravel-Handbuch angegeben , können Sie mit dieser --stepOption eine bestimmte Anzahl von Migrationen zurücksetzen

php artisan migrate:rollback --step=5
Slawischer Levin
quelle
nur Laravel 5.3, also kann alles, was unter dieser Version codiert ist, es nicht verwenden
Jeffz
Dies würde im Fall des OP nicht helfen, da eine bestimmte Anzahl von Migrationen zurückgesetzt wird, nicht eine einzelne angegebene Migration. "--step3" würde immer noch alle 3 Migrationen zurücksetzen.
Skeets
0

Eine weitere Alternative zu den genannten, wenn Sie dies einige Male mit denselben Migrationen durchführen müssen. Persönlich denke ich, dass dies Ihren Migrationen viel Flexibilität verleiht.

Fügen Sie database/migrationsIhrem Autoload-Objekt Folgendes hinzu composer.json:

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

Dann füge hinzu namespace Database\Migrations; dann alle Ihre Migrationsdateien hinzu.

Dann laufen Sie $ composer dump-autoload, um Ihre zu aktualisierencomposer.lock Datei .

Unter der Annahme, dass Ihr Klassenname für die Migration lautet AlterTableWebDirectories, können Sie einen Befehl wie den folgenden erstellen:

$ php artisan make:command DropAlterTableWebDirectories

Und schreiben Sie diese Logik in Ihre handle()Methode:

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

Dies wird genau das tun, was Sie wollen. Wenn Sie die Anzahl der Migrationen verringern möchten, anstatt sie zu löschen, können Sie wahrscheinlich herausfinden, wie Sie die Anzahl ändern könnenDB:raw Befehl .

Dieser Befehl kann erweitert werden, damit Sie dynamisch auswählen können, welche Migration Sie löschen möchten, indem Sie ein Argument an den Befehl übergeben.

Wenn Sie dann lesen, um diese Datei erneut zu migrieren, können Sie sie einfach ausführen php artisan migrate und sie migriert nur diese.

Mit diesem Prozess können Sie bestimmte Änderungen an Migrationen vornehmen, ohne jedes Mal eine vollständige Aktualisierung und einen Startwert vornehmen zu müssen.

Persönlich muss ich das viel tun, weil meine Samen ziemlich groß sind.

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

Wenn Sie Zugriff auf die Datenbank haben, haben Sie eine einfachere Lösung. Sie können den Datensatz aus der Migrationstabelle löschen und dann einfach die Tabelle löschen . mit SQL-Client.

Und kann verwenden

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

Wie viele Antworten. Und denken Sie daran, der Pfad ist Standort. Sie können sogar die Modulmigration auf diese Weise entfernen. (Jede Migration von anywhare)

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

Und denken Sie daran: Wenn Sie Linux-Server verwenden, achten Sie auf die Groß- und Kleinschreibung. Sie müssen like / Database / Migrations mit Startkapital hinzufügen .

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
Aruna Perera
quelle