Откат одной конкретной миграции в Laravel


238

я хочу

только для отката:

Rolled back: 2015_05_15_195423_alter_table_web_directories


я бегу

php artisan migrate:rollback3 моих миграции откатились.

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

Я удаляю

и мой web_directoriesи мой contactsстол непреднамеренно. Я никогда не хочу, чтобы это произошло, и если я смогу откатить только эту конкретную, эта катастрофа никогда не произойдет.


46
upvote! только за то, как вы написали этот вопрос :)
Sliq

Я использую sqlpro, он позволил мне изменить номер партии, поэтому я просто изменил номер и просто откатился
откат

Учитывая будущие откаты, используйте «php artisan migrate --step» для поэтапного запуска каждой миграции, которая будет выполнять откат только на одну миграцию при запуске php artisan migrate: откат
Джеймс

Ответы:


146

Если вы посмотрите в migrationsтаблицу, то увидите, что у каждой миграции есть номер партии. Поэтому, когда вы выполняете откат, он откатывает каждую миграцию, которая была частью последнего пакета.

Если вы хотите откатить только последнюю миграцию, просто увеличьте номер партии на единицу. Затем в следующий раз, когда вы запустите rollbackкоманду, она откатит только одну миграцию, так как она находится в отдельной «партии».


Хорошая рекомендация! Я пытался отредактировать номер партии, он мне не дал. Это своего рода замок и серый цвет. Я попробовал это в MySQL WorkBench на моем Mac. Есть идеи по этому поводу?
cyber8200

Знаете ли вы, почему мой номер партии заблокирован, когда я пытался их настроить?
cyber8200

1
Обновите номер партии в таблице миграции по запросу, например: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Имран Хан

3
@ImranKhan Жесткое кодирование номера партии в '2' не особенно хорошо, если у вас более двух партий.
Мартин Бин

Используйте Sequel Pro (только для Mac OS), чтобы легко редактировать таблицу миграции и изменять номера партий.
Арслан

271

Laravel 5.3+

Откат на один шаг. Врожденная.

php artisan migrate:rollback --step=1

И вот страница справочника: документы .


Laravel 5.2 и раньше

Без хлопот не обойтись. Для деталей, проверьте ответ Мартина Бина .


1
Тем не менее, бесполезно, если ОП не пишет свое приложение с версией Laravel в разработке.
Мартин Бин,

4
Это было бы хорошей функцией, но в ней не хватает функциональности, чтобы указать, какую из миграций нужно откатить. Я предполагаю, что это только последний из перечисленных в таблице миграции? Когда я выполняю миграцию, я обычно не планирую откат, поэтому шансы на миграцию, которую я хочу откатить, будучи последней, не очень высоки. Похоже, что Laravel вроде упал мяч на этом. Я полагаю, что единственный безопасный способ откатить одну миграцию - это редактировать таблицу миграции вручную.
Скитс

@ SkeetsO'Reilly Согласен, миграция не очень хорошо продумана. Но они здесь, поэтому вы не будете вынуждены искать пакет миграции с самого начала.
Yauheni Prakopchyk

Оно работало завораживающе. Я разрабатывал новую миграцию (добавляя столбец к существующей таблице), затем я увидел, что я мигрировал с типом «uuid», я хотел «строку». Ваш отзыв отката работал отлично. Откат. Обновить код Снова мигрируй. => 100% хорошо Laravel 5.7
Флориан Дойен

Как я могу получить мои последние N шагов миграции с помощью (php artisan) командной строки. если я хочу, я могу обратиться к базе данных и найти свою таблицу миграции и запрос, чтобы получить мою историю и мою последнюю миграцию, которая была запущена. но с другой стороны, я не всегда могу использовать свою папку миграции, потому что новая миграция не всегда сортируется. для этой проблемы я просто рекомендую использовать php artisan make: миграцию и не использовать копии файлов миграции из середины существующих файлов.
сабля tabatabaee yazdi

24

Каждый раз, когда вы выполняете откат, вы получаете последний пакет миграции. используйте команду

php artisan migrate:rollback --step=1

18

Если вы не можете сделать то, что говорит @Martin Bean, тогда вы можете попробовать другой трюк.

Создайте новую миграцию и в этом файле в методе up () вставьте метод from (down) миграции, которую вы хотите откатить, а в метод down () вставьте метод up ().

например, если ваша первоначальная миграция такая

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

затем в новом файле миграции сделайте это

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

и затем запустите миграцию, он удалит таблицу. и если вы снова захотите это вернуть, просто откатитесь назад.


Спасибо за ваш ответ, но я готов к этому. Быстрый вопрос для вас, знаете ли вы, почему я не могу редактировать пакетный столбец моей таблицы миграции?
cyber8200

1
@ihue немного поздно, но причина, по которой вы не можете редактировать его с помощью пользовательского интерфейса, заключается в том, что у таблиц миграции нет первичного ключа. Вы должны написать SQL, чтобы отредактировать его самостоятельно.
Вик

15

лучше использовать обновление мигрировать

Вы можете откатить и перенастроить ограниченное количество миграций, указав параметр step в команде refresh. Например, следующая команда выполнит откат и перенастроит последние две миграции:

php artisan migrate:refresh --step=2

иначе используется откат мигрировать

Вы можете откатить ограниченное количество миграций, указав опцию step в команде rollback. Например, следующая команда откатит последние три миграции:

php artisan migrate:rollback --step=3

подробнее о миграции см.


11

Лучший способ - создать новую миграцию и внести в нее необходимые изменения.

В худшем случае ( если у вас есть доступ к БД и у вас все в порядке с СБРОСОМ данных этой таблицы ):

  1. Перейдите в БД и удалите / переименуйте запись миграции дляyour-specific-migration
  2. Удалить таблицу, созданнуюyour-specific-migration
  3. Бегать php artisan migrate --path=/database/migrations/your-specific-migration.php

Это заставит laravel выполнить эту конкретную миграцию, так как в истории миграции Laravel нет записи об этом

ОБНОВЛЕНИЕ : путь Laravel (Спасибо, @ thiago-valente)

Бегать:

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

а потом:

php artisan migrate

Это перезапустит эту конкретную миграцию


4
Я использовал php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpИ наконец php artisan migrate
Тьяго Валенте

8

Возможно, будет немного поздно ответить на этот вопрос, но я считаю, что это очень хороший, чистый и эффективный способ сделать это. Я постараюсь быть максимально тщательным.

Перед созданием миграций создайте разные каталоги, например:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Затем при создании миграций выполните следующую команду (на примере таблиц):

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

или

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

или

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

Приведенные выше команды сделают файл миграции внутри заданного пути к каталогу. Затем вы можете просто выполнить следующую команду, чтобы перенести файлы через назначенные им каталоги.

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

* Примечание: вы можете изменить batch_1 на batch_2 или batch_3 или любое другое имя папки, в которой вы храните файлы миграции. Пока оно остается в каталоге базы данных / миграций или некотором указанном каталоге.

Далее, если вам нужно откатить ваши конкретные миграции, вы можете откатить пакетно, как показано ниже:

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

или

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

или

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

Использование этих методов позволит вам более гибко управлять вашими базами данных и любыми изменениями, внесенными в вашу схему.


Если документация laravel неверна, «--step = 3» означает, что она откатит последние 3 миграции, а не от 3-го до последнего запуска миграции. Я не знаю, изменит ли это перенос миграций в разные папки, но я не ожидаю этого. Если указание отката по имени работает, это было бы здорово! Однако, если вы предоставите откат каких-либо аргументов, он будет жаловаться на «слишком много аргументов».
Скитс

4

Откат на один шаг. Врожденная.

php artisan migrate:rollback --step=1

Откат на два шага. Врожденная.

php artisan migrate:rollback --step=2


4

Если вы хотите откат последней миграции.

php artisan migrate:rollback

Если вы хотите откатить конкретную миграцию, перейдите в таблицу миграции и установите максимальное значение этой записи в пакете. Затем.

php artisan migrate:rollback

В настоящее время я работаю над Laravel 5.8, если не работает любая другая версия Laravel, пожалуйста, сообщите мне.


было полезно для меня. Именно такой случай с последней миграцией.
CodeToLife

3

Перенос таблиц по очереди.

Измените номер партии миграции, для которой вы хотите выполнить откат, на самый высокий.

Запустите миграцию: откат.

Возможно, не самый удобный способ справиться с более крупными проектами.


3

Если вы хотите изменить исходный файл миграции и перенести его снова, вы можете использовать этот пакет для миграции. (Применимо к Laravel 5.4 или более поздней версии )

Сначала установите пакет в свой проект Laravel:

composer require caloskao/migrate-specific

Зарегистрировать команду по адресу app/Console/Kernel.php:

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

Теперь запустите эту команду, чтобы перенести ваш файл

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

Это может быть достигнуто с помощью php artisan:migrate --path=database/migrations/my_migration.php. Непосредственно перед тем, как сделать это, убедитесь, что в migrationsтаблице нет записи для my_migration.
Александар

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

что-то вроде этого


1

1.) Внутри базы данных перейдите к таблице миграции и удалите запись миграции, относящуюся к таблице, которую вы хотите удалить.

Пример изображения таблицы миграции

2.) Затем удалите таблицу, связанную с миграцией, которую вы только что удалили из инструкции 1.

Удалить пример изображения таблицы

3.) Наконец, внесите необходимые изменения в файл миграции таблицы, которую вы удалили из инструкции №. 2 затем запустите, php artisan migrateчтобы перенести таблицу снова.


0

Как указано в руководстве Laravel , вы можете откатить определенное количество миграций, используя --stepопцию

php artisan migrate:rollback --step=5

только Laravel 5.3, поэтому все, что закодировано ниже этой версии, не может его использовать
Jeffz

Это не поможет в случае с OP, так как откатит определенное количество миграций, а не одну указанную миграцию. «--step3» все равно откатит все 3 миграции.
Скитс

0

Еще одна альтернатива упомянутым, если вам нужно делать это несколько раз с одними и теми же миграциями. Лично я думаю, что это добавляет гибкости вашей миграции.

Добавьте database/migrationsк вашему объекту автозагрузки в вашем composer.jsonвиде:

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

Затем добавьте namespace Database\Migrations;все ваши файлы миграции.

Затем запустите, $ composer dump-autoloadчтобы обновить composer.lockфайл.

Затем, предполагая, что ваше имя класса для миграции AlterTableWebDirectories, вы можете создать команду, подобную этой:

$ php artisan make:command DropAlterTableWebDirectories

И напишите эту логику в вашем handle()методе:

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

Это будет делать именно то, что вы хотите. Если вы хотите уменьшить счетчик миграции вместо того, чтобы удалить его, вы, вероятно, сможете выяснить, как изменить DB:rawкоманду.

Эта команда может быть расширена, чтобы вы могли динамически выбирать, какую миграцию вы отбрасываете, передавая аргумент в команду.

Затем, когда вы читаете, чтобы перенести этот файл снова, вы можете просто запустить, php artisan migrateи он перенесет только этот.

Этот процесс позволяет вносить конкретные изменения в миграции без необходимости каждый раз выполнять полное обновление и заполнение.

Лично мне нужно делать это много, потому что мои семена довольно большие.


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

0

Если у вас есть доступ к БД, у вас есть более простое решение. Вы можете удалить запись из таблицы миграции, а затем просто удалить ее. с клиентом SQL.

И может использовать

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

Как и многие ответы. И помните, что путь - это Местоположение. Вы можете удалить даже миграцию модуля следующим образом. (Любая миграция из anywhare)

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

И помните, если вы используете серверы Linux, будьте внимательны с учетом регистра. Вы должны добавить как / База данных / Миграции со стартовым капиталом.

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.