Revertir una migración específica en Laravel

238

quiero

solo para revertir:

Rolled back: 2015_05_15_195423_alter_table_web_directories


Corro

php artisan migrate:rollback, 3 de mis migraciones están retrocediendo.

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

Yo borro

tanto yo web_directoriescomo mi contactsmesa sin querer. Nunca quiero que eso suceda, y si puedo revertir solo ese específico, este desastre nunca sucederá.

cyber8200
fuente
46
¡Votar! solo por la forma en que escribiste esta pregunta :)
Sliq
Estoy usando sqlpro, me permitió cambiar el número de lote, así que simplemente cambié el número y simplemente retrocedí
roll
Teniendo en cuenta las futuras reversiones, use 'php artisan migrate --step' para ejecutar cada migración paso a paso, que solo revertirá una migración cuando ejecute php artisan migrate: rollback
James

Respuestas:

146

Si mira en su migrationstabla, verá que cada migración tiene un número de lote. Entonces, cuando retrocede, retrocede cada migración que fue parte del último lote.

Si solo desea revertir la última migración, incremente el número de lote en uno. Luego, la próxima vez que ejecute el rollbackcomando, solo revertirá esa migración ya que está en un "lote" propio.

Frijol Martin
fuente
Buena recomendación! Traté de editar el número de lote, no me deja. Es una especie de cerradura y gris. Lo intenté en MySQL WorkBench en mi Mac. ¿Alguna idea sobre eso?
cyber8200
¿Sabes por qué mi número de lote está bloqueado cuando intenté configurarlos?
cyber8200
1
Actualice el número de lote en la tabla de migraciones por consulta como: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan
3
@ImranKhan Codificar el número de lote a '2' no es particularmente bueno si tiene más de dos lotes.
Martin Bean
Use Sequel Pro (solo para Mac OS) para editar fácilmente su tabla de Migraciones y cambiar los números de lote.
Arslan Ramay
271

Laravel 5.3+

Retroceda un paso. Nativamente

php artisan migrate:rollback --step=1

Y aquí está la página del manual: docs .


Laravel 5.2 y antes

No hay forma de hacerlo sin problemas. Para más detalles, verifique la respuesta de Martin Bean .

Yauheni Prakopchyk
fuente
1
Sin embargo, no es útil a menos que el OP haya estado escribiendo su aplicación con la versión en desarrollo de Laravel.
Martin Bean
44
Esta sería una buena característica, pero le falta la funcionalidad para especificar qué migraciones revertir. ¿Supongo que solo es el último que figura en la tabla de migraciones? Cuando migro cosas, generalmente no planeo retroceder, por lo que las posibilidades de que la migración que quiero revertir sea la última migración no son muy altas. Parece que laravel dejó caer la pelota en este caso. Supongo que la única forma segura de deshacer una única migración es editar la tabla de migración manualmente.
Skeets
@ SkeetsO'Reilly De acuerdo, las migraciones no están muy bien pensadas. Pero están aquí, por lo que no se verá obligado a buscar el paquete de migración desde el principio.
Yauheni Prakopchyk
Funcionó a las mil maravillas. Estaba desarrollando una nueva migración (agregando una columna a una tabla existente), luego vi que migraba con el tipo "uuid", quería "string". Su punta de retroceso funcionó perfectamente. Retroceder. Actualizar código Migrar de nuevo. => 100% bien. Laravel 5.7
Florian Doyen
¿Cómo puedo obtener mis últimos pasos de migración de N con la línea de comando (php artisan)? si quiero, puedo buscar db y encontrar mi tabla de migración y consultar para recuperar mi historial y mi última migración que se ejecuta. pero, por otro lado, no siempre puedo usar mi carpeta de migración porque la nueva migración no siempre está ordenada. para este problema, solo recomiendo que usemos php artisan make: migración y no use una copia de los archivos de migración del medio de esos archivos existentes.
saber tabatabaee yazdi
24

Cada vez que retrocede, obtiene el último lote de migración. usa el comando

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

Si no puede hacer lo que le dice @Martin Bean, puede probar con otro truco.

Cree una nueva migración y en ese archivo en el método up () inserte lo que está en el método down () de la migración que desea revertir y en el método down () inserte lo que está en el método up ().

por ejemplo, si su migración original es así

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

entonces en el nuevo archivo de migración haga esto

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

y luego ejecute la migración, eliminará la tabla. y si de nuevo quieres recuperarlo, simplemente retrocede.

Nehal Hasnayeen
fuente
Gracias por su respuesta, pero estoy listo con esto. Pregunta rápida para usted, ¿sabe por qué no puedo editar la columna por lotes de mi tabla de migración?
cyber8200
1
@ihue poco tarde, pero la razón por la que no puede editarlo con la interfaz de usuario es que las migraciones de la tabla no tienen una clave principal. Tienes que escribir el sql para editarlo tú mismo.
Vic
15

mejor usar refrescar migrar

Puede revertir y volver a migrar un número limitado de migraciones al proporcionar la opción de paso al comando de actualización. Por ejemplo, el siguiente comando revertirá y volverá a migrar las dos últimas migraciones:

php artisan migrate:refresh --step=2

de lo contrario se usa la migración de reversión

Puede revertir un número limitado de migraciones al proporcionar la opción de paso al comando de reversión. Por ejemplo, el siguiente comando revertirá las últimas tres migraciones:

php artisan migrate:rollback --step=3

para más detalles sobre la migración ver

Jignesh Joisar
fuente
11

La mejor manera es crear una nueva migración y hacer los cambios necesarios en eso.

Solución alternativa en el peor de los casos ( si tiene acceso a DB plus , está de acuerdo con un RESET de los datos de esa tabla ):

  1. Vaya a DB y elimine / cambie el nombre de la entrada de migración parayour-specific-migration
  2. Descarte la tabla creada poryour-specific-migration
  3. correr php artisan migrate --path=/database/migrations/your-specific-migration.php

Esto obligará a laravel a ejecutar esa migración específica ya que no existe una entrada al respecto en el historial de migración de Laravel

ACTUALIZACIÓN : La manera de Laravel (Gracias, @ thiago-valente)

Correr:

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

y entonces:

php artisan migrate

Esto volverá a ejecutar esa migración particular

Deepak Thomas
fuente
44
He usado php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpY finalmente php artisan migrate
Thiago Valente
8

Puede que sea un poco tarde para responder esta pregunta, pero he aquí una forma muy buena, limpia y eficiente de hacerlo. Intentaré ser lo más minucioso posible.

Antes de crear sus migraciones, cree diferentes directorios así:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Luego, al crear sus migraciones, ejecute el siguiente comando (utilizando sus tablas como ejemplo):

     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

Los comandos anteriores harán que el archivo de migración se encuentre dentro de la ruta de directorio dada. Luego, simplemente puede ejecutar el siguiente comando para migrar sus archivos a través de sus directorios asignados.

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

* Nota: puede cambiar lote_1 a lote_2 o lote_3 o cualquier nombre de carpeta en el que esté almacenando los archivos de migración. Siempre y cuando permanezca dentro del directorio de base de datos / migraciones o algún directorio especificado.

A continuación, si necesita revertir sus migraciones específicas, puede revertir por lote como se muestra a continuación:

    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

El uso de estas técnicas le permitirá una mayor flexibilidad y control sobre su (s) base (s) de datos y cualquier modificación realizada en su esquema.

Andre F.
fuente
A menos que la documentación de laravel sea incorrecta, "--step = 3" significa que revertirá las últimas 3 migraciones, no la tercera a la última ejecución de migración. No sé si poner las migraciones en diferentes carpetas cambiaría eso, pero no lo esperaría. Si especificar la reversión por nombre funciona, ¡sería genial! Sin embargo, si da argumentos de reversión, se queja de "demasiados argumentos".
Skeets
4

Retroceda un paso. Nativamente

php artisan migrate:rollback --step=1

Rollback de dos pasos. Nativamente

php artisan migrate:rollback --step=2
Parth kharecha
fuente
4

Si desea revertir la última migración.

php artisan migrate:rollback

Si desea revertir una migración específica, vaya a la tabla de migración y configure el valor más alto de ese registro en lote. Luego.

php artisan migrate:rollback

Actualmente estoy trabajando en laravel 5.8 si no funciona en ninguna otra versión de laravel, infórmeme.

Raghu Aryan
fuente
fue útil para mi Exactamente tal caso con la última migración.
CodeToLife
3

Migrar tablas una por una.

Cambie el número de lote de la migración que desea revertir al más alto.

Ejecute migrate: rollback.

Puede que no sea la forma más cómoda de lidiar con proyectos más grandes.

Jeffz
fuente
3

Si desea modificar el archivo de migración original y volver a migrarlo, puede usar este paquete para migrar. (Aplicable a Laravel 5.4 o posterior)

Primero, instale el paquete en su proyecto Laravel:

composer require caloskao/migrate-specific

Registre el comando en app/Console/Kernel.php:

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

Ahora, ejecuta este comando para migrar tu archivo

php artisan migrate:specific database/migrations/table.php
Calos
fuente
Esto se puede lograr mediante el uso php artisan:migrate --path=database/migrations/my_migration.php. Justo antes de hacerlo, asegúrese de que la migrationstabla no tenga una entrada para my_migration.
Aleksandar
1
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

algo como esto

Harry Bosh
fuente
1

1.) Dentro de la base de datos, diríjase a la tabla de migraciones y elimine la entrada de la migración relacionada con la tabla que desea eliminar.

Ejemplo de imagen de tabla de migración

2.) Luego, elimine la tabla relacionada con la migración que acaba de eliminar de la instrucción 1.

Eliminar ejemplo de imagen de tabla

3.) Finalmente, realice los cambios que desee en el archivo de migración de la tabla que eliminó de la instrucción no. 2 luego ejecute php artisan migratepara migrar la tabla nuevamente.

Kidali Kevin
fuente
0

Como se indica en el manual de Laravel , puede revertir un número específico de migraciones utilizando la --stepopción

php artisan migrate:rollback --step=5
Slav Levin
fuente
solo Laravel 5.3, por lo que cualquier cosa codificada debajo de esa versión no puede usarlo
Jeffz
Esto no ayudaría en el caso del OP, ya que revertirá un cierto número de migraciones, no una sola migración especificada. "--step3" aún revertiría las 3 migraciones.
Skeets
0

Otra alternativa a las mencionadas si necesita hacer esto varias veces con las mismas migraciones. Personalmente, creo que esto agrega mucha flexibilidad a sus migraciones.

Agregue database/migrationsa su objeto de carga automática de composer.jsonesta manera:

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

Luego agregue namespace Database\Migrations;a todos sus archivos de migración.

Luego, ejecuta $ composer dump-autoloadpara actualizar tu composer.lockarchivo.

Luego, suponiendo que su nombre de clase para la migración sea AlterTableWebDirectories, puede crear un comando como este:

$ php artisan make:command DropAlterTableWebDirectories

Y escribe esta lógica en tu handle()método:

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

Esto hará exactamente lo que quieras. Si desea disminuir el recuento de migración en lugar de eliminarlo, probablemente pueda descubrir cómo cambiar el DB:rawcomando.

Este comando podría ampliarse para permitirle elegir dinámicamente qué migración está descartando al pasar un argumento al comando.

Luego, cuando esté leyendo para migrar ese archivo nuevamente, simplemente puede ejecutarlo php artisan migratey solo migrará ese archivo .

Este proceso le permite realizar cambios específicos en las migraciones sin tener que realizar una actualización completa y inicializar cada vez.

Personalmente, necesito hacer eso mucho porque mis semillas son bastante grandes.

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

Si tiene acceso a la base de datos, tiene una solución más fácil. Puede eliminar el registro de la tabla de migraciones y luego simplemente soltar la tabla. con cliente SQL.

Y puede usar

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

Como muchas respuestas. Y recuerda que el camino es la ubicación. Puede eliminar incluso la migración de módulos de esta manera. (Cualquier migración desde anywhare)

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

Y recuerde, si está utilizando servidores Linux, tenga cuidado con la mayúsculas y minúsculas. Debe agregar Me gusta / Base de datos / Migraciones con capital inicial.

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