Cofnij jedną konkretną migrację w Laravel


238

chcę

tylko do wycofania:

Rolled back: 2015_05_15_195423_alter_table_web_directories


biegnę

php artisan migrate:rollback3 migracje są wycofywane.

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

kasuję

zarówno mój, jak web_directoriesi mój contactsstół przypadkowo. Nigdy nie chcę, aby tak się stało, a jeśli uda mi się przywrócić tylko ten konkretny, katastrofa nigdy się nie wydarzy.


46
głosuj! tak jak napisałeś to pytanie :)
Sliq

Korzystam z sqlpro, to pozwala mi zmienić numer partii, więc właśnie zmieniłem numer i właśnie wycofałem
roll

Biorąc pod uwagę przyszłe wycofania, użyj 'php artisan migrate --step', aby uruchomić każdą migrację krok po kroku, która przywróci tylko jedną migrację po uruchomieniu php artisan migrate: rollback
James

Odpowiedzi:


146

Jeśli zajrzysz do swojego migrations tabelę, zobaczysz, że każda migracja ma numer partii. Więc kiedy wycofujesz, przywraca każdą migrację, która była częścią ostatniej partii.

Jeśli chcesz cofnąć tylko ostatnią migrację, po prostu zwiększ numer partii o jeden. Następnie następnym razem, gdy uruchomisz rollbackpolecenie, przywróci ono tylko jedną migrację, ponieważ jest ona „własną partią”.


Dobra rekomendacja! Próbowałem edytować numer partii, to mi nie pozwala. To rodzaj blokady i wyszarzenia. Próbowałem tego w MySQL WorkBench na komputerze Mac. Masz jakiś pomysł na ten temat?
cyber8200

Czy wiesz dlaczego, mój numer partii to blokada, gdy próbowałem je skonfigurować?
cyber8200

1
Zaktualizuj numer partii w tabeli migracji według zapytania: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan

3
@ImranKhan Kodowanie numeru partii na „2” nie jest szczególnie świetne, jeśli masz więcej niż dwie partie.
Martin Bean

Użyj Sequel Pro (tylko dla Mac OS), aby łatwo edytować tabelę Migracje i zmieniać numery partii.
Arslan Ramay

271

Laravel 5.3+

Cofnij się o jeden krok. Natywnie

php artisan migrate:rollback --step=1

A oto strona podręcznika: dokumenty .


Laravel 5.2 i wcześniejsze

Nie da się obejść bez kłopotów. Aby uzyskać szczegółowe informacje, sprawdź Martina Beana odpowiedź .


1
Nie jest to przydatne, chyba że OP napisał swoją aplikację w opracowywanej wersji Laravela.
Martin Bean

4
To byłaby dobra funkcja, ale brakuje jej funkcji określającej, które migracje mają zostać wycofane. Zakładam, że to tylko ostatni wymieniony w tabeli migracji? Kiedy migruję rzeczy, zwykle nie planuję wycofywania, więc szanse migracji, którą chcę wycofać jako ostatnią migrację, nie są bardzo duże. Wygląda na to, że Laravel upuścił piłkę. Podejrzewam, że jedynym bezpiecznym sposobem na wycofanie pojedynczej migracji jest ręczna edycja tabeli migracji.
Skeets,

@ SkeetsO'Reilly Zgoda, migracje nie są zbyt dobrze przemyślane. Ale są tutaj, więc nie będziesz musiał szukać pakietu migracji od samego początku.
Yauheni Prakopchyk

Działa jak urok. Tworzyłem nową migrację (dodając kolumnę do istniejącej tabeli), potem zobaczyłem, że przeprowadziłem migrację typu „uuid”, chciałem „ciąg”. Twoja końcówka cofania działała idealnie. Wycofanie Zaktualizuj kod. Przeprowadź migrację ponownie. => 100% ok. Laravel 5.7
Florian Doyen

jak mogę pobrać moje ostatnie N kroków migracji za pomocą wiersza poleceń (php artisan). jeśli chcę, mogę znaleźć bazę danych i znaleźć tabelę migracji oraz zapytanie, aby pobrać moją historię i ostatnią uruchomioną migrację. ale z drugiej strony nie mogę zawsze używać folderu migracji, ponieważ nowa migracja nie zawsze jest posortowana. w przypadku tego problemu po prostu zalecam użycie php artisan make: migracja i nie używaj kopii plików migracji ze środka istniejących plików.
szabla tabatabaee yazdi

24

Za każdym razem, gdy wycofujesz, otrzymujesz ostatnią partię migracji. użyj polecenia

php artisan migrate:rollback --step=1

18

Jeśli nie możesz zrobić tego, co mówi @Martin Bean, możesz spróbować innej sztuczki.

Utwórz nową migrację i do tego pliku w metodzie up () wstaw metodę „down” metody migracji, którą chcesz wycofać, a metodą „down” wstaw metodę metody „up” ().

np. jeśli Twoja pierwotna migracja jest taka

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

następnie zrób to w nowym pliku migracji

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

a następnie uruchom migrację, usunie tabelę. a jeśli znowu chcesz to cofnąć, po prostu cofnij ją.


Dziękuję za odpowiedź, ale wszystko gotowe. Szybkie pytanie, czy wiesz, dlaczego nie mogę edytować kolumny partii mojej tabeli migracji?
cyber8200

1
@ihue trochę późno, ale powodem, dla którego nie można go edytować za pomocą interfejsu użytkownika, jest to, że migracje tabel nie mają klucza podstawowego. Musisz napisać sql, aby sam go edytować.
Vic

15

lepiej zastosować migrację odświeżania

Możesz wycofać i ponownie przeprowadzić migrację ograniczonej liczby migracji, podając opcję krok komendy odświeżania. Na przykład następujące polecenie spowoduje wycofanie i ponowną migrację dwóch ostatnich migracji:

php artisan migrate:refresh --step=2

w przeciwnym razie migracja zostanie cofnięta

Możesz cofnąć ograniczoną liczbę migracji, podając opcję kroku w poleceniu wycofania. Na przykład następujące polecenie przywróci ostatnie trzy migracje:

php artisan migrate:rollback --step=3

Aby uzyskać więcej informacji na temat migracji zobacz


11

Najlepszym sposobem jest utworzenie nowej migracji i dokonanie w niej wymaganych zmian.

Obejście najgorszego przypadku ( jeśli masz dostęp do bazy danych DB i możesz zresetować dane z tej tabeli ):

  1. Przejdź do DB i usuń / zmień nazwę wpisu migracji dlayour-specific-migration
  2. Upuść tabelę utworzoną przezyour-specific-migration
  3. Biegać php artisan migrate --path=/database/migrations/your-specific-migration.php

Zmusi to laravel do uruchomienia tej konkretnej migracji, ponieważ w historii migracji Laravela nie ma żadnego wpisu na jej temat

AKTUALIZACJA : The Laravel way (Thanks, @ thiago-valente)

Biegać:

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

i wtedy:

php artisan migrate

Spowoduje to ponowne uruchomienie tej konkretnej migracji


4
Użyłem php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpI wreszcie php artisan migrate
Thiago Valente

8

Odpowiedź na to pytanie może być trochę za późno, ale czuję, że jest to bardzo dobry, czysty i skuteczny sposób. Postaram się być tak dokładny, jak to możliwe.

Przed utworzeniem migracji utwórz różne katalogi:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Następnie podczas tworzenia migracji uruchom następujące polecenie (na przykład tabelach):

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

lub

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

lub

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

Powyższe polecenia utworzą plik migracji w ramach danej ścieżki katalogu. Następnie możesz po prostu uruchomić następujące polecenie, aby przeprowadzić migrację plików za pośrednictwem przypisanych katalogów.

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

* Uwaga: Możesz zmienić batch_1 na batch_2 lub batch_3 lub dowolną nazwę folderu, w którym przechowujesz pliki migracji. Tak długo, jak długo będzie on przechowywany w katalogu database / migrations lub w określonym katalogu.

Następnie, jeśli chcesz przywrócić określone migracje, możesz je wycofać wsadowo, jak pokazano poniżej:

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

lub

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

lub

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

Korzystanie z tych technik zapewni większą elastyczność i kontrolę nad bazą danych i wszelkimi modyfikacjami wprowadzonymi do schematu.


O ile dokumentacja laravel jest niepoprawna, „--step = 3” oznacza, że ​​cofnie ostatnie 3 migracje, a nie od 3. do ostatniego uruchomienia migracji. Nie wiem, czy umieszczenie migracji w różnych folderach w ogóle to zmieni, ale nie spodziewałbym się, że tak się stanie. Jeśli określenie wycofania według nazwy działa, byłoby świetnie! Jeśli jednak cofniesz argumenty, narzeka on na „zbyt wiele argumentów”.
Skeets,

4

Cofnij się o jeden krok. Natywnie

php artisan migrate:rollback --step=1

Wycofaj dwa kroki. Natywnie

php artisan migrate:rollback --step=2


4

Jeśli chcesz cofnąć ostatnią migrację.

php artisan migrate:rollback

Jeśli chcesz przywrócić konkretną migrację, przejdź do tabeli migracji i ustaw najwyższą wartość tego rekordu wsadowo. Następnie.

php artisan migrate:rollback

Aktualnie pracuję na laravel 5.8, jeśli nie działa na żadnej innej wersji laravel, proszę o informację.


było dla mnie przydatne. Dokładnie taki przypadek dotyczy ostatniej migracji.
CodeToLife

3

Migruj tabele jeden po drugim.

Zmień numer partii migracji, którą chcesz wycofać, na najwyższą.

Uruchom migrację: wycofanie.

Może nie być najwygodniejszym sposobem radzenia sobie z większymi projektami.


3

Jeśli chcesz zmodyfikować oryginalny plik migracji i przeprowadzić migrację ponownie, możesz użyć tego pakietu do migracji. (Dotyczy Laravel 5.4 lub nowszego)

Najpierw zainstaluj pakiet w swoim projekcie Laravel:

composer require caloskao/migrate-specific

Zarejestruj polecenie w app/Console/Kernel.php:

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

Teraz uruchom to polecenie, aby przeprowadzić migrację pliku

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

Można to osiągnąć za pomocą php artisan:migrate --path=database/migrations/my_migration.php. Zanim to zrobisz, upewnij się, że w migrationstabeli nie ma wpisu my_migration.
Aleksandar

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

coś takiego


1

1.) W bazie danych przejdź do tabeli migracji i usuń wpis migracji związany z tabelą, którą chcesz upuścić.

Przykład obrazu tabeli migracji

2.) Następnie usuń tabelę dotyczącą migracji, którą właśnie usunąłeś z instrukcji 1.

Usuń przykład obrazu tabeli

3.) Na koniec wprowadź zmiany w pliku migracji tabeli usuniętej z instrukcji nr. 2, a następnie uruchom php artisan migrateponownie migrację tabeli.


0

Jak stwierdzono w podręczniku Laravel , możesz wycofać określoną liczbę migracji za pomocą tej --stepopcji

php artisan migrate:rollback --step=5

tylko Laravel 5.3, więc nic zakodowane poniżej tej wersji nie może z niego korzystać
Jeffz

Nie pomogłoby to w przypadku PO, ponieważ przywróci pewną liczbę migracji, a nie pojedynczą określoną migrację. „--step3” nadal wycofuje wszystkie 3 migracje.
Skeets,

0

Inna alternatywa dla tych wymienionych, jeśli musisz to zrobić kilka razy z tymi samymi migracjami. Osobiście uważam, że zapewnia to dużą elastyczność migracji.

Dodaj database/migrationsdo obiektu autoload w composer.jsonpodobny sposób:

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

Następnie dodaj namespace Database\Migrations; do wszystkich plików migracji.

Następnie uruchom, $ composer dump-autoloadaby odświeżyćcomposer.lock plik.

Następnie, zakładając, że twoja nazwa klasy dla migracji to AlterTableWebDirectories, możesz utworzyć następującą komendę:

$ php artisan make:command DropAlterTableWebDirectories

I napisz tę logikę w swojej handle()metodzie:

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

To zrobi dokładnie to, co chcesz. Jeśli chcesz zmniejszyć liczbę migracji zamiast ją usunąć, prawdopodobnie możesz dowiedzieć się, jak to zmienićDB:raw polecenie.

To polecenie można rozszerzyć, aby umożliwić Ci dynamiczny wybór migracji, którą chcesz upuścić, przekazując argument do polecenia.

Następnie, gdy czytasz, aby ponownie migrować ten plik, możesz po prostu uruchomić php artisan migrate a on migruje tylko ten jeden.

Ten proces umożliwia wprowadzanie określonych zmian w migracji bez konieczności pełnego odświeżania i inicjowania za każdym razem.

Osobiście muszę to często robić, ponieważ moje nasiona są raczej duże.


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

0

Jeśli masz dostęp do bazy danych, masz łatwiejsze rozwiązanie. Możesz usunąć rekord z tabeli migracji, a następnie po prostu upuścić tabelę. z klientem SQL.

I można użyć

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

Jak wiele odpowiedzi. I pamiętaj, że ścieżka to Lokalizacja. Możesz usunąć nawet migrację modułów w ten sposób. (Każda migracja z dowolnego miejsca)

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

I pamiętaj, jeśli używasz serwerów linux, uważaj na rozróżnianie wielkości liter. Musisz dodać like / Database / Migrations z kapitałem początkowym.

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.