Ripristina una migrazione specifica in Laravel


238

Voglio

al solo rollback:

Rolled back: 2015_05_15_195423_alter_table_web_directories


io corro

php artisan migrate:rollback, 3 della mia migrazione stanno tornando indietro.

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

cancello

sia il mio web_directoriesche il mio contactstavolo involontariamente. Non voglio mai che ciò accada, e se posso ripristinare solo quello specifico, questo disastro non accadrà mai.


46
upvote! solo per il modo in cui hai scritto questa domanda :)
Sliq

Sto usando sqlpro, mi permette di cambiare il numero di lotto, quindi ho appena cambiato il numero e ho appena eseguito il rollback
roll

Considerando i rollback futuri, usa 'php artisan migrate --step' per eseguire passo dopo passo ogni migrazione che eseguirà il rollback di una sola migrazione quando esegui php artisan migrate: rollback
James

Risposte:


146

Se guardi nella tua migrationstabella, vedrai che ogni migrazione ha un numero di lotto. Pertanto, quando si esegue il rollback, esegue il rollback di ogni migrazione che faceva parte dell'ultimo batch.

Se desideri solo ripristinare l'ultima migrazione, incrementa il numero di lotto di uno solo. Quindi la prossima volta che eseguirai il rollbackcomando, eseguirà il rollback di quella migrazione poiché si trova in un "batch" a sé stante.


Buona raccomandazione! Ho provato a modificare il numero di lotto, non me lo permette. È una specie di lucchetto e grigio. L'ho provato in MySQL WorkBench sul mio Mac. Qualche idea su questo?
cyber8200,

Sai perché, il mio numero di lotto è bloccato quando ho provato a configurarli?
cyber8200,

1
Aggiorna il numero di lotto nella tabella delle migrazioni per query come: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan,

3
@ImranKhan Codificare in modo rigido il numero di lotto su '2' non è particolarmente utile se si dispone di più di due lotti.
Martin Bean,

Usa Sequel Pro (solo per Mac OS) per modificare facilmente la tabella delle migrazioni e cambiare i numeri di lotto.
Arslan Ramay,

271

Laravel 5.3+

Ripristina di un passaggio. Nativamente.

php artisan migrate:rollback --step=1

Ed ecco la pagina di manuale: documenti .


Laravel 5.2 e precedenti

Non c'è modo di fare a meno di qualche seccatura. Per i dettagli, controlla la risposta di Martin Bean .


1
Non utile a meno che OP non abbia scritto la sua applicazione con la versione in sviluppo di Laravel.
Martin Bean,

4
Questa sarebbe una buona funzionalità, ma manca la funzionalità per specificare quale delle migrazioni eseguire il rollback. Presumo che sia l'ultimo elencato nella tabella delle migrazioni? Quando migra le cose, di solito non ho intenzione di tornare indietro, quindi le possibilità della migrazione che voglio ripristinare come ultima migrazione non sono molto alte. Sembra che Laravel abbia lasciato cadere la palla su questo. L'unico modo sicuro per eseguire il rollback di una singola migrazione è modificare manualmente la tabella di migrazione, suppongo.
Skeets

@ SkeetsO'Reilly D'accordo, le migrazioni non sono pensate molto bene. Ma sono qui, quindi non sarai costretto a cercare il pacchetto di migrazione fin dall'inizio.
Yauheni Prakopchyk,

Ha funzionato come un fascino. Stavo sviluppando una nuova migrazione (aggiungendo una colonna a una tabella esistente), poi ho visto che ho migrato con il tipo "uuid", volevo "stringa". La punta del rollback ha funzionato perfettamente. Rollback. Codice di aggiornamento. Migrare di nuovo. => 100% ok. Laravel 5.7
Florian Doyen,

come posso recuperare i miei ultimi N passaggi di migrazione dalla riga di comando (php artisan). se voglio, posso cercare di trovare e trovare la mia tabella di migrazione e la mia query per recuperare la mia cronologia e la mia ultima migrazione eseguita. ma d'altra parte, non posso sempre usare la mia cartella di migrazione perché la nuova migrazione non è sempre ordinata. per questo problema consiglio solo di usare php artisan make: migrazione e non usare la copia dei file di migrazione dal centro di quei file esistenti.
sabre tabatabaee yazdi

24

Ogni volta che esegui il rollback ottieni l'ultimo batch di migrazione. usa il comando

php artisan migrate:rollback --step=1

18

Se non riesci a fare ciò che viene detto da @Martin Bean, puoi provare un altro trucco.

Crea una nuova migrazione e su quel file nel metodo up () inserisci il metodo down () della migrazione che desideri eseguire il rollback e nel metodo down () inserisci il metodo up ().

ad es. se la migrazione originale è così

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

quindi nel nuovo file di migrazione farlo

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

e quindi esegui la migrazione, eliminerà la tabella. e se lo desideri di nuovo, ripristinalo.


Grazie per la tua risposta, ma sono pronto per questo. Domanda veloce per te, sai perché non riesco a modificare la colonna batch della mia tabella di migrazione?
cyber8200,

1
@ihue un po 'in ritardo ma il motivo per cui non è possibile modificarlo utilizzando l'interfaccia utente è che le migrazioni della tabella non hanno una chiave primaria. Devi scrivere il sql per modificarlo tu stesso.
Vic

15

meglio usare aggiornamento migrare

È possibile eseguire il rollback e rieseguire la migrazione di un numero limitato di migrazioni fornendo l'opzione di passaggio al comando di aggiornamento. Ad esempio, il comando seguente eseguirà il rollback e eseguirà nuovamente la migrazione delle ultime due migrazioni:

php artisan migrate:refresh --step=2

altrimenti usato rollback migrare

È possibile eseguire il rollback di un numero limitato di migrazioni fornendo l'opzione step al comando rollback. Ad esempio, il comando seguente eseguirà il rollback delle ultime tre migrazioni:

php artisan migrate:rollback --step=3

per maggiori dettagli sulla migrazione vedere


11

Il modo migliore è creare una nuova migrazione e apportare le necessarie modifiche.

Peggior soluzione alternativa del caso ( se si ha accesso a DB plus si va bene con un RESET dei dati di quella tabella ):

  1. Andare su DB ed eliminare / rinominare la voce di migrazione peryour-specific-migration
  2. Rilascia la tabella creata dayour-specific-migration
  3. Correre php artisan migrate --path=/database/migrations/your-specific-migration.php

Ciò costringerà laravel a eseguire quella specifica migrazione in quanto non esiste alcuna voce al riguardo nella cronologia delle migrazioni di Laravel

AGGIORNAMENTO : The Laravel way (Grazie, @ thiago-valente)

Correre:

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

e poi:

php artisan migrate

Ciò eseguirà nuovamente quella particolare migrazione


4
Ho usato php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpE finalmente php artisan migrate
Thiago Valente,

8

Potrebbe essere un po 'tardi per rispondere a questa domanda, ma ecco un ottimo modo, pulito ed efficiente per farlo, credo. Cercherò di essere il più accurato possibile.

Prima di creare le tue migrazioni crea diverse directory in questo modo:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Quindi, durante la creazione delle migrazioni, eseguire il comando seguente (utilizzando le tabelle come esempio):

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

o

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

o

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

I comandi precedenti renderanno il file di migrazione all'interno del percorso di directory indicato. Quindi puoi semplicemente eseguire il seguente comando per migrare i tuoi file tramite le loro directory assegnate.

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

* Nota: è possibile modificare batch_1 in batch_2 o batch_3 o in qualsiasi nome di cartella in cui si stanno archiviando i file di migrazione. Fintanto che rimane all'interno della directory database / migrations o in qualche directory specificata.

Successivamente, se è necessario eseguire il rollback delle migrazioni specifiche, è possibile eseguire il rollback per batch come mostrato di seguito:

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

o

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

o

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

L'uso di queste tecniche ti consentirà una maggiore flessibilità e controllo sui tuoi database e su qualsiasi modifica apportata al tuo schema.


A meno che la documentazione di laravel non sia errata, "--step = 3" significa che eseguirà il rollback delle ultime 3 migrazioni, non della terza o ultima esecuzione della migrazione. Non so se mettere le migrazioni in cartelle diverse lo cambierebbe affatto, ma non me lo sarei aspettato. Se specificare il rollback per nome funziona, sarebbe fantastico! Se si esegue il rollback di qualsiasi argomento, tuttavia, si lamenta "troppi argomenti".
Skeets

4

Ripristina di un passaggio. Nativamente.

php artisan migrate:rollback --step=1

Ripristino in due passaggi. Nativamente.

php artisan migrate:rollback --step=2


4

Se si desidera ripristinare l'ultima migrazione.

php artisan migrate:rollback

Se desideri eseguire il rollback di una migrazione specifica, vai alla tabella delle migrazioni e imposta il valore più alto di quel record in batch. Poi.

php artisan migrate:rollback

Attualmente sto lavorando su laravel 5.8 se non funziona qualsiasi altra versione di laravel, per favore informatemi.


è stato utile per me. Esattamente un caso del genere con l'ultima migrazione.
CodeToLife

3

Migrare le tabelle una per una.

Modificare il numero batch della migrazione che si desidera ripristinare al massimo.

Esegui migrazione: rollback.

Potrebbe non essere il modo più comodo per gestire progetti più grandi.


3

Se si desidera modificare il file di migrazione originale e migrarlo di nuovo, è possibile utilizzare questo pacchetto per migrare. (Applicabile a Laravel 5.4 o successivo)

Innanzitutto, installa il pacchetto nel tuo progetto Laravel:

composer require caloskao/migrate-specific

Registrare il comando su app/Console/Kernel.php:

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

Ora, esegui questo comando per migrare il tuo file

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

Questo può essere ottenuto utilizzando php artisan:migrate --path=database/migrations/my_migration.php. Prima di farlo, assicurati che la migrationstabella non abbia una voce per my_migration.
Aleksandar,

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

qualcosa come questo


1

1.) All'interno del database, vai alla tabella delle migrazioni ed elimina la voce della migrazione relativa alla tabella che desideri eliminare.

Esempio di immagine della tabella di migrazione

2.) Quindi, eliminare la tabella relativa alla migrazione appena eliminata dall'istruzione 1.

Elimina l'esempio dell'immagine della tabella

3.) Infine, apporta le modifiche desiderate al file di migrazione della tabella che hai eliminato dall'istruzione n. 2 quindi esegui php artisan migrateper migrare nuovamente la tabella.


0

Come indicato nel manuale di Laravel , è possibile ripristinare il numero specifico di migrazioni utilizzando l' --stepopzione

php artisan migrate:rollback --step=5

solo Laravel 5.3, quindi tutto ciò che è codificato sotto quella versione non può usarlo
Jeffz,

Ciò non sarebbe d'aiuto nel caso del PO, poiché eseguirà il rollback di un determinato numero di migrazioni, non di una singola migrazione specificata. "--step3" eseguirà comunque il rollback di tutte e 3 le migrazioni.
Skeets,

0

Un'altra alternativa a quelle menzionate se è necessario farlo più volte con le stesse migrazioni. Personalmente penso che questo aggiunga molta flessibilità alle tue migrazioni.

Aggiungi database/migrationsal tuo oggetto di caricamento automatico in composer.jsonquesto modo:

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

Quindi aggiungi namespace Database\Migrations;a tutti i tuoi file di migrazione.

Quindi esegui $ composer dump-autoloadper aggiornare il tuo composer.lockfile.

Quindi, supponendo che il nome della classe per la migrazione sia AlterTableWebDirectories, è possibile creare un comando come questo:

$ php artisan make:command DropAlterTableWebDirectories

E scrivi questa logica nel tuo handle()metodo:

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

Questo farà esattamente quello che vuoi. Se si desidera ridurre il conteggio delle migrazioni anziché eliminarlo, è probabile che si riesca a capire come modificare il DB:rawcomando.

Questo comando può essere esteso per consentire di scegliere dinamicamente quale migrazione si sta abbandonando passando un argomento nel comando.

Quindi, quando stai leggendo per migrare di nuovo quel file, puoi semplicemente eseguire php artisan migratee migrerà solo quello.

Questo processo consente di apportare modifiche specifiche alle migrazioni senza dover aggiornare e seminare ogni volta.

Personalmente devo farlo molto perché i miei semi sono piuttosto grandi.


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

0

Se hai accesso al DB hai una soluzione più semplice. È possibile eliminare il record dalla tabella delle migrazioni e quindi semplicemente rilasciare la tabella. con client SQL.

E può usare

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

Come molte risposte. E ricorda che il percorso è Location. Puoi rimuovere anche la migrazione dei moduli in questo modo. (Qualsiasi migrazione da anywhare)

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

E ricorda, se stai usando server Linux attenti alla distinzione tra maiuscole e minuscole. Devi aggiungere come / Database / Migrazioni con capitale iniziale.

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.