Restauration d'une migration spécifique dans Laravel


238

Je voudrais

pour annuler uniquement:

Rolled back: 2015_05_15_195423_alter_table_web_directories


je cours

php artisan migrate:rollback, 3 de ma migration sont annulées.

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

j'efface

à la fois de ma table web_directorieset ma contactsinvolontairement. Je ne veux jamais que cela se produise, et si je ne peux annuler que celui-là, cette catastrophe ne se produira jamais.


46
vote positif! juste pour la façon dont vous avez écrit cette question :)
Sliq

J'utilise sqlpro, cela m'a permis de changer le numéro de lot, donc je viens de changer le numéro et je viens de revenir en arrière
roll

Compte tenu des annulations futures, utilisez «php artisan migrate --step» pour exécuter chaque migration étape par étape, ce qui ne rétrogradera qu'une seule migration lorsque vous exécuterez php artisan migrate: rollback
James

Réponses:


146

Si vous regardez dans votre migrationstableau, vous verrez que chaque migration a un numéro de lot. Ainsi, lorsque vous annulez, il annule chaque migration qui faisait partie du dernier lot.

Si vous souhaitez uniquement annuler la toute dernière migration, incrémentez simplement le numéro de lot d'un. Ensuite, la prochaine fois que vous exécuterez la rollbackcommande, elle ne fera que restaurer cette migration car elle est dans un «lot» qui lui est propre.


Bonne recommandation! J'ai essayé de modifier le numéro de lot, ça ne me le permettra pas. C'est une sorte de verrou et de gris. J'ai essayé cela dans MySQL WorkBench sur mon Mac. Une idée à ce sujet?
cyber8200

Savez-vous pourquoi mon numéro de lot est verrouillé lorsque j'ai essayé de les configurer?
cyber8200

1
Mettre à jour le numéro de lot dans la table des migrations par requête comme: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan

3
@ImranKhan Coder en dur le numéro de lot sur «2» n'est pas particulièrement efficace si vous avez plus de deux lots.
Martin Bean

Utilisez Sequel Pro (pour Mac OS uniquement) pour modifier facilement votre table de migrations et modifier les numéros de lot.
Arslan Ramay

271

Laravel 5.3+

Annulez une étape. Nativement.

php artisan migrate:rollback --step=1

Et voici la page de manuel: docs .


Laravel 5.2 et versions antérieures

Pas moyen de se passer de tracas. Pour plus de détails, consultez la réponse de Martin Bean .


1
Pas utile à moins que l'OP n'ait écrit son application avec la version en développement de Laravel.
Martin Bean

4
Ce serait une bonne fonctionnalité, mais il lui manque la fonctionnalité pour spécifier laquelle des migrations à annuler. Je suppose qu'il fait juste le dernier répertorié dans le tableau des migrations? Lorsque je migre des choses, je ne prévois généralement pas de revenir en arrière, donc les chances que la migration que je veux revenir en arrière soit la dernière migration ne sont pas très élevées. On dirait que laravel a laissé tomber le ballon sur celui-ci. Le seul moyen sûr d'annuler une seule migration est de modifier la table de migration manuellement, je suppose.
Skeets

@ SkeetsO'Reilly D'accord, les migrations ne sont pas extrêmement bien pensées. Mais ils sont là, vous ne serez donc pas obligé de rechercher le package de migration dès le début.
Yauheni Prakopchyk

Ça a marché comme sur des roulettes. Je développais une nouvelle migration (en ajoutant une colonne à une table existante), puis j'ai vu que j'avais migré avec le type "uuid", je voulais "string". Votre astuce de restauration a parfaitement fonctionné. Retour en arriere. Mettre à jour le code. Migrez à nouveau. => 100% ok. Laravel 5.7
Florian Doyen

comment puis-je récupérer mes N dernières étapes de migration par ligne de commande (artisan php). si je veux, je peux chercher à db et trouver ma table de migration et requête pour récupérer mon historique et ma dernière migration qui s'exécute. mais d'autre part, je ne peux pas toujours utiliser mon dossier de migration car la nouvelle migration n'est pas toujours triée. pour ce problème, je recommande simplement d'utiliser php artisan make: migration et de ne pas utiliser de copie des fichiers de migration à partir du milieu de ces fichiers existants.
saber tabatabaee yazdi

24

Chaque fois que vous annulez, vous obtenez le dernier lot de migration. utiliser la commande

php artisan migrate:rollback --step=1

18

Si vous ne pouvez pas faire ce qui est dit par @Martin Bean, alors vous pouvez essayer une autre astuce.

Créez une nouvelle migration et dans ce fichier dans la méthode up () insérez ce qui est dans la méthode down () de la migration que vous souhaitez restaurer et dans la méthode down () insérez ce qui est dans la méthode up ().

par exemple, si votre migration d'origine est comme ça

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

puis dans le nouveau fichier de migration, faites cela

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

puis exécutez la migration, il supprimera la table. et si vous voulez à nouveau le récupérer, faites-le simplement revenir en arrière.


Merci pour votre réponse, mais je suis prêt pour cela. Question rapide pour vous, savez-vous pourquoi je ne peux pas modifier la colonne batch de ma table de migration?
cyber8200

1
@ihue peu de temps mais la raison pour laquelle vous ne pouvez pas le modifier à l'aide de l'interface utilisateur est que les migrations de table n'ont pas de clé primaire. Vous devez écrire le sql pour le modifier vous-même.
Vic

15

mieux utiliser rafraîchir migrer

Vous pouvez annuler et re-migrer un nombre limité de migrations en fournissant l'option step à la commande de rafraîchissement. Par exemple, la commande suivante annulera et re-migrera les deux dernières migrations:

php artisan migrate:refresh --step=2

migration utilisée autrement

Vous pouvez annuler un nombre limité de migrations en fournissant l'option step à la commande rollback. Par exemple, la commande suivante annulera les trois dernières migrations:

php artisan migrate:rollback --step=3

pour plus de détails sur la migration, voir


11

Le meilleur moyen est de créer une nouvelle migration et d'y apporter les modifications requises.

Pire solution de contournement ( si vous avez accès à DB plus vous êtes d'accord avec une réinitialisation des données de cette table ):

  1. Accédez à la base de données et supprimez / renommez l'entrée de migration pouryour-specific-migration
  2. Déposez la table créée paryour-specific-migration
  3. Courir php artisan migrate --path=/database/migrations/your-specific-migration.php

Cela forcera Laravel à exécuter cette migration spécifique car aucune entrée à ce sujet n'existe dans l'historique de migration de Laravel.

MISE À JOUR : La voie Laravel (Merci, @ thiago-valente)

Courir:

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

puis:

php artisan migrate

Cela va relancer cette migration particulière


4
J'ai utilisé php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpEt enfin php artisan migrate
Thiago Valente

8

Il peut être un peu tard pour répondre à cette question, mais voici une manière très bonne, propre et efficace de le faire, je le sens. J'essaierai d'être aussi complet que possible.

Avant de créer vos migrations, créez différents répertoires comme ceci:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Ensuite, lors de la création de vos migrations, exécutez la commande suivante (en utilisant vos tables comme exemple):

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

ou

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

ou

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

Les commandes ci-dessus créeront le fichier de migration dans le chemin de répertoire donné. Ensuite, vous pouvez simplement exécuter la commande suivante pour migrer vos fichiers via leurs répertoires attribués.

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

* Remarque: vous pouvez remplacer batch_1 par batch_2 ou batch_3 ou par tout autre nom de dossier dans lequel vous stockez les fichiers de migration. Tant qu'il reste dans le répertoire database / migrations ou dans un répertoire spécifié.

Ensuite, si vous devez annuler vos migrations spécifiques, vous pouvez annuler par lot comme indiqué ci-dessous:

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

ou

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

ou

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

L'utilisation de ces techniques vous permettra plus de flexibilité et de contrôle sur vos bases de données et toutes les modifications apportées à votre schéma.


Sauf si la documentation de laravel est incorrecte, "--step = 3" signifie qu'il annulera les 3 dernières migrations, pas la 3ème à la dernière exécution de la migration. Je ne sais pas si mettre les migrations dans différents dossiers changerait cela du tout, mais je ne m'attendrais pas à ce que cela se produise. Si la spécification de la restauration par nom fonctionne, ce serait bien! Cependant, si vous annulez des arguments, il se plaint "trop ​​d'arguments".
Skeets

4

Annulez une étape. Nativement.

php artisan migrate:rollback --step=1

Rollback deux étapes. Nativement.

php artisan migrate:rollback --step=2


4

Si vous souhaitez annuler la dernière migration.

php artisan migrate:rollback

Si vous souhaitez annuler une migration spécifique, accédez à la table de migration et définissez la valeur la plus élevée de cet enregistrement par lot. Ensuite.

php artisan migrate:rollback

Actuellement, je travaille sur laravel 5.8 si je ne travaille pas sur une autre version de laravel, veuillez m'en informer.


m'a été utile. Exactement un tel cas avec la dernière migration.
CodeToLife

3

Migrez les tables une par une.

Modifiez le numéro de lot de la migration que vous souhaitez restaurer au plus élevé.

Exécutez migrate: rollback.

Ce n'est peut-être pas la façon la plus confortable de gérer des projets plus importants.


3

Si vous souhaitez modifier le fichier de migration d'origine et le migrer à nouveau, vous pouvez utiliser ce package pour migrer. (Applicable à Laravel 5.4 ou version ultérieure)

Tout d'abord, installez le package dans votre projet Laravel:

composer require caloskao/migrate-specific

Enregistrer la commande sur app/Console/Kernel.php:

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

Maintenant, exécutez cette commande pour migrer votre fichier

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

Ceci peut être réalisé en utilisant php artisan:migrate --path=database/migrations/my_migration.php. Juste avant de le faire, assurez-vous que la migrationstable n'a pas d'entrée pour my_migration.
Aleksandar

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

quelque chose comme ça


1

1.) Dans la base de données, dirigez-vous vers la table des migrations et supprimez l'entrée de la migration liée à la table que vous souhaitez supprimer.

Exemple d'image de table de migration

2.) Ensuite, supprimez le tableau relatif à la migration que vous venez de supprimer de l'instruction 1.

Exemple de suppression d'image de tableau

3.) Enfin, effectuez les modifications souhaitées dans le fichier de migration de la table que vous avez supprimée de l'instruction no. 2 puis exécutez php artisan migratepour migrer à nouveau la table.


0

Comme indiqué dans le manuel de Laravel , vous pouvez annuler un nombre spécifique de migrations en utilisant l' --stepoption

php artisan migrate:rollback --step=5

seulement Laravel 5.3, donc tout ce qui est codé en dessous de cette version ne peut pas l'utiliser
Jeffz

Cela n'aiderait pas dans le cas de l'OP, car il annulera un certain nombre de migrations, pas une seule migration spécifiée. "--step3" annulerait toujours les 3 migrations.
Skeets

0

Une autre alternative à celles mentionnées si vous devez le faire plusieurs fois avec les mêmes migrations. Personnellement, je pense que cela ajoute beaucoup de flexibilité à vos migrations.

Ajoutez database/migrationsà votre objet de chargement automatique dans votre composer.jsoncomme ceci:

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

Ajoutez ensuite namespace Database\Migrations;à tous vos fichiers de migration.

Ensuite, exécutez $ composer dump-autoloadpour actualiser votre composer.lockfichier.

Ensuite, en supposant que le nom de votre classe pour la migration est AlterTableWebDirectories, vous pouvez créer une commande comme celle-ci:

$ php artisan make:command DropAlterTableWebDirectories

Et écrivez cette logique dans votre handle()méthode:

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

Cela fera exactement ce que vous voulez. Si vous souhaitez décrémenter le nombre de migrations au lieu de le supprimer, vous pouvez probablement comprendre comment modifier la DB:rawcommande.

Cette commande peut être étendue pour vous permettre de choisir dynamiquement la migration que vous supprimez en passant un argument dans la commande.

Ensuite, lorsque vous lisez pour migrer à nouveau ce fichier, vous pouvez simplement exécuter php artisan migrateet il ne migrera que celui-ci.

Ce processus vous permet d'apporter des modifications spécifiques aux migrations sans avoir à effectuer une régénération complète et un amorçage à chaque fois.

Personnellement, je dois beaucoup faire ça parce que mes graines sont plutôt grosses.


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

0

Si vous avez accès à la base de données, vous avez une solution plus simple. Vous pouvez supprimer l'enregistrement de la table des migrations , puis simplement déposer la table. avec le client SQL.

Et peut utiliser

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

Comme beaucoup de réponses. Et rappelez-vous que le chemin est l'emplacement. Vous pouvez supprimer même la migration de module comme celle-ci. (Toute migration depuis anywhare)

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

Et rappelez-vous, si vous utilisez des serveurs Linux, faites attention à la casse. Vous devez ajouter comme / Database / Migrations avec le capital de départ.

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.