Retroceder uma migração específica no Laravel


238

eu quero

para reverter apenas:

Rolled back: 2015_05_15_195423_alter_table_web_directories


eu corro

php artisan migrate:rollback, 3 da minha migração estão revertendo.

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

eu apago

Ambos os meus web_directoriese minha contactsmesa sem querer. Eu nunca quero que isso aconteça, e se eu puder reverter apenas esse específico, esse desastre nunca acontecerá.


46
upvote! apenas para a maneira que você escreveu esta pergunta :)
SliQ

Eu estou usando SQLPro, ele deixe-me mudar o número do lote, então eu só mudou o número e apenas rollbacked
rolo de

Considerando as futuras reversões, use 'php artisan migrate --step' para executar cada migração passo a passo, que reverterá apenas uma migração quando você executar o php artisan migrate: rollback
James

Respostas:


146

Se você olhar na sua migrationstabela, verá que cada migração tem um número de lote. Portanto, quando você reverte, reverte cada migração que fazia parte do último lote.

Se você deseja reverter apenas a última migração, apenas aumente o número do lote em um. Da próxima vez que você executar o rollbackcomando, ele reverterá apenas essa migração, pois está em um "lote" próprio.


Boa recomendação! Eu tentei editar o número do lote, ele não me permite. É uma espécie de cadeado e acinzentado. Eu tentei isso no MySQL WorkBench no meu Mac. Alguma ideia disso?
22868 cyber8200

Você sabe por que, meu número de lote está bloqueado quando tentei configurá-los?
cyber8200

1
Atualize o número do lote na tabela de migrações por consulta como: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
precisa

3
@ImranKhan Codificar o número do lote para '2' não é particularmente bom se você tiver mais de dois lotes.
Martin Bean

Use o Sequel Pro (apenas para Mac OS) para editar facilmente sua tabela de Migrações e alterar os números de lote.
Arslan Ramay 01/12/19

271

Laravel 5.3+

Retroceder um passo. Nativamente.

php artisan migrate:rollback --step=1

E aqui está a página do manual: docs .


Laravel 5.2 e anterior

Não há maneira de fazer sem algum aborrecimento. Para detalhes, consulte a resposta de Martin Bean .


1
Não é útil, a menos que o OP esteja escrevendo seu aplicativo com a versão em desenvolvimento do Laravel.
Martin Bean

4
Esse seria um bom recurso, mas falta a funcionalidade para especificar qual das migrações reverter. Presumo que apenas o último listado na tabela de migrações? Quando migro as coisas, normalmente não planejo reverter, portanto, as chances da migração que desejo retroceder sendo a última migração não são muito altas. Parece que o laravel meio que deixou cair a bola neste. A única maneira segura de reverter uma única migração é editar a tabela de migração manualmente, suponho.
Skeets

@ SkeetsO'Reilly De acordo, as migrações não são extremamente bem pensadas. Mas eles estão aqui, então você não será forçado a procurar o pacote de migração desde o início.
Yauheni Prakopchyk 8/09/16

Funcionou como um encanto. Eu estava desenvolvendo uma nova migração (adicionando uma coluna a uma tabela existente) e vi que migrava com o tipo "uuid", queria "string". Sua dica de reversão funcionou perfeitamente. Reversão. Código de atualização. Migre novamente. => 100% ok. Laravel 5.7
Florian Doyen 28/01

como posso buscar minhas últimas N etapas de migração pela linha de comando (php artisan). se eu quiser, posso procurar no banco de dados e encontrar minha tabela e consulta de migração para buscar meu histórico e minha última migração em execução. mas, por outro lado, nem sempre posso usar minha pasta de migração porque a nova migração nem sempre é classificada. para esse problema, eu apenas recomendo que usemos o php artisan make: migration e não use cópia dos arquivos de migração do meio desses arquivos existentes.
sabre tabatabaee yazdi 19/06

24

Toda vez que você reverte, recebe o último lote de migração. use o comando

php artisan migrate:rollback --step=1

18

Se você não pode fazer o que é dito por @Martin Bean, pode tentar outro truque.

Crie uma nova migração e nesse arquivo no método up () insira o que está no método down () da migração que você deseja reverter e no método down () insira o que está no método up ().

por exemplo, se sua migração original for assim

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

em seguida, no novo arquivo de migração, faça isso

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

e, em seguida, execute a migração, ela excluirá a tabela. e se você quiser novamente, basta reverter.


Obrigado pela sua resposta, mas estou pronto para isso. Pergunta rápida para você, você sabe por que não consigo editar a coluna de lote da minha tabela de migração?
18135 cyber8200

1
@ihue pouco tarde, mas o motivo de você não poder editá-lo usando a interface do usuário é que as migrações da tabela não têm uma chave primária. Você precisa escrever o sql para editá-lo.
Vic

15

melhor usar atualização migrar

Você pode reverter e migrar novamente um número limitado de migrações, fornecendo a opção de etapa para o comando refresh. Por exemplo, o seguinte comando reverterá e migrará novamente as duas últimas migrações:

php artisan migrate:refresh --step=2

migração de reversão usada de outra forma

Você pode reverter um número limitado de migrações, fornecendo a opção de etapa para o comando de reversão. Por exemplo, o seguinte comando reverterá as três últimas migrações:

php artisan migrate:rollback --step=3

para obter mais detalhes sobre migração, consulte


11

A melhor maneira é criar uma nova migração e fazer as alterações necessárias.

Solução alternativa para o pior caso ( se você tiver acesso ao banco de dados e estiver bem com uma redefinição dos dados dessa tabela ):

  1. Vá para DB e exclua / renomeie a entrada de migração parayour-specific-migration
  2. Solte a tabela criada poryour-specific-migration
  3. Corre php artisan migrate --path=/database/migrations/your-specific-migration.php

Isso forçará o laravel a executar essa migração específica, pois não existe nenhuma entrada no histórico de migração do Laravel

ATUALIZAÇÃO : O caminho do Laravel (Obrigado, @ thiago-valente)

Corre:

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

e depois:

php artisan migrate

Isso executará novamente essa migração específica


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

8

Pode ser um pouco tarde para responder a essa pergunta, mas aqui está uma maneira muito boa, limpa e eficiente de fazê-lo. Vou tentar ser o mais completo possível.

Antes de criar suas migrações, crie diretórios diferentes, como:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Em seguida, ao criar suas migrações, execute o seguinte comando (usando suas tabelas como exemplo):

     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

Os comandos acima criarão o arquivo de migração dentro do caminho do diretório especificado. Em seguida, você pode simplesmente executar o seguinte comando para migrar seus arquivos através dos diretórios atribuídos.

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

* Nota: Você pode alterar lote_1 para lote_2 ou lote_3 ou qualquer outro nome de pasta em que esteja armazenando os arquivos de migração. Contanto que permaneça no diretório banco de dados / migrações ou em algum diretório especificado.

Em seguida, se você precisar reverter suas migrações específicas, poderá reverter por lote, como mostrado abaixo:

    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

O uso dessas técnicas permitirá maior flexibilidade e controle sobre o (s) banco (s) de dados e quaisquer modificações feitas no seu esquema.


A menos que a documentação do laravel esteja incorreta, "--step = 3" significa que ele reverterá as três últimas migrações, não a terceira à última migração. Não sei se colocar as migrações em pastas diferentes mudaria isso, mas não esperava. Se especificar a reversão pelo nome funcionar, seria ótimo! Se você reverter algum argumento, no entanto, ele reclamará "muitos argumentos".
Skeets

4

Retroceder um passo. Nativamente.

php artisan migrate:rollback --step=1

Retroceder duas etapas. Nativamente.

php artisan migrate:rollback --step=2


4

Se você deseja reverter a última migração.

php artisan migrate:rollback

Se você deseja reverter a migração específica, acesse a tabela de migração e defina o valor mais alto desse registro em lote. Então.

php artisan migrate:rollback

Atualmente, estou trabalhando no laravel 5.8, se não estiver trabalhando em nenhuma outra versão do laravel, por favor me informe.


foi útil para mim. Exatamente nesse caso com a última migração.
CodeToLife 29/04

3

Migrar tabelas uma por uma.

Altere o número do lote da migração que você deseja reverter para o mais alto.

Execute migrate: rollback.

Pode não ser a maneira mais confortável de lidar com projetos maiores.


3

Se você deseja modificar o arquivo de migração original e migrá-lo novamente, é possível usar este pacote para migrar. (Aplicável ao Laravel 5.4 ou posterior)

Primeiro, instale o pacote no seu projeto do Laravel:

composer require caloskao/migrate-specific

Comando Register em app/Console/Kernel.php:

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

Agora, execute este comando para migrar seu arquivo

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

Isso pode ser alcançado usando php artisan:migrate --path=database/migrations/my_migration.php. Antes de você, verifique se a migrationstabela não possui uma 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 assim


1

1.) Dentro do banco de dados, vá para a tabela de migrações e exclua a entrada da migração relacionada à tabela que você deseja excluir.

Exemplo de imagem da tabela de migração

2.) Em seguida, exclua a tabela relacionada à migração que você acabou de excluir da instrução 1.

Excluir exemplo de imagem da tabela

3.) Finalmente, faça as alterações desejadas no arquivo de migração da tabela excluída da instrução no. 2, em seguida, execute php artisan migratepara migrar a tabela novamente.


0

Conforme declarado no manual do Laravel , você pode reverter um número específico de migrações usando a --stepopção

php artisan migrate:rollback --step=5

única Laravel 5.3, então qualquer coisa codificado abaixo essa versão não pode usá-lo
Jeffz

Isso não ajudaria no caso do OP, pois reverteria um certo número de migrações, não uma única migração especificada. "--step3" ainda reverteria todas as três migrações.
Skeets

0

Outra alternativa às mencionadas, se você precisar fazer isso várias vezes com as mesmas migrações. Pessoalmente, acho que isso adiciona muita flexibilidade às suas migrações.

Adicione database/migrationsao seu objeto de carregamento automático composer.jsoncomo este:

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

Em seguida, adicione namespace Database\Migrations;a todos os seus arquivos de migração.

Em seguida, execute $ composer dump-autoloadpara atualizar seu composer.lockarquivo.

Então, supondo que o nome da sua classe para a migração seja AlterTableWebDirectories, você pode criar um comando como este:

$ php artisan make:command DropAlterTableWebDirectories

E escreva esta lógica no seu handle()método:

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

Isso fará exatamente o que você deseja. Se você quiser diminuir a contagem de migração em vez de excluí-la, provavelmente poderá descobrir como alterar oDB:raw comando.

Esse comando pode ser estendido para permitir que você escolha dinamicamente qual migração você está eliminando, passando um argumento para o comando.

Então, quando você estiver lendo para migrar esse arquivo novamente, basta executar php artisan migrate e ele apenas migrará esse .

Esse processo permite que você faça alterações específicas nas migrações sem precisar fazer uma atualização completa e propagar cada vez.

Pessoalmente, preciso fazer muito isso porque minhas sementes são bastante grandes.


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

0

Se você tiver acesso ao banco de dados, terá uma solução mais fácil. Você pode excluir o registro da tabela de migrações e simplesmente soltar a tabela. com cliente SQL.

E pode usar

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

Como muitas respostas. E lembre-se de que o caminho é Localização. Você pode remover até a migração de módulos como esta. (Qualquer migração de anywhare)

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

E lembre-se, se você estiver usando servidores Linux, tenha cuidado com a distinção entre maiúsculas e minúsculas. Você deve adicionar como / Banco de Dados / Migrações com capital inicial.

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.