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

58

Я хочу

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

Rolled back: 2015_05_15_195423_alter_table_web_directories


Я запустил

php artisan migrate:rollback, 3 моей миграции откатываются.

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 и my contacts непреднамеренно. К сожалению, я никогда не хочу, чтобы это произошло, и если я могу откатиться только от этого конкретного, эта катастрофа никогда не случится.


Надеюсь,

кто-то может научить меня, как предотвратить это снова.

Любые рекомендации будут высоко оценены.

  • 26
    upvote! только за то, как ты написал этот вопрос :)
  • 0
    Я использую sqlpro, это позволило мне изменить номер партии, поэтому я просто изменил номер и просто откатился
Теги:
database-migration
laravel-5
laravel-4

8 ответов

48
Лучший ответ

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

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

  • 0
    Хорошая рекомендация! Я пытался отредактировать номер партии, он мне не дал. Это своего рода замок и серый цвет. Я попробовал это в MySQL WorkBench на моем Mac. Есть идеи по этому поводу?
  • 0
    Знаете ли вы, почему мой номер партии заблокирован, когда я пытался их настроить?
Показать ещё 7 комментариев
85

Laravel 5.3 +

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

php artisan migrate:rollback --step=1

И вот страница руководства: docs.


Laravel 5.2 и до

Невозможно обойтись без каких-либо хлопот. Подробнее см. В разделе Мартин Bean .

  • 1
    Тем не менее, бесполезно, если ОП не пишет свое приложение с разработанной версией Laravel.
  • 2
    Это было бы хорошей функцией, но в ней не хватает функциональности, чтобы указать, какую из миграций нужно откатить. Я предполагаю, что это только последний из перечисленных в таблице миграции? Когда я выполняю миграцию, я обычно не планирую откат, поэтому шансы на миграцию, которую я хочу откатить, будучи последней, не очень высоки. Похоже, что Laravel вроде упал мяч на этом. Я полагаю, что единственный безопасный способ откатить одну миграцию - это редактировать таблицу миграции вручную.
Показать ещё 1 комментарий
8

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

Создайте новую миграцию и в этом файле в методе up() вставьте то, что в методе 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');
    });
}

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

  • 0
    Спасибо за ваш ответ, но я готов к этому. Быстрый вопрос для вас, знаете ли вы, почему я не могу редактировать пакетный столбец моей таблицы миграции?
  • 0
    вы пробовали, запустив sql запрос?
Показать ещё 1 комментарий
3

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

Перед созданием ваших миграций создайте разные каталоги:

    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

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

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

Перенесите таблицы один за другим.

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

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

Не может быть самым удобным способом решения крупных проектов.

1

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

php artisan migrate:rollback --step=5
  • 0
    только Laravel 5.3, поэтому все, что закодировано ниже этой версии, не может его использовать
  • 0
    Это не поможет в случае с OP, так как откатит определенное количество миграций, а не одну указанную миграцию. «--step3» все равно откатит все 3 миграции.
1
INSERT INTO homestead.bb_migrations (`migration`, `batch`)  VALUES ('2016_01_21_064436_create_victory_point_balance_table', '2')

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

0

Чтобы отменить последнюю операцию миграции, вы можете использовать команду отката. Эта команда откатывает последнюю "пакетную" миграцию, которая может содержать несколько файлов миграции:

php artisan migrate:rollback

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

php artisan migrate:rollback --step=1

Команда migrate: reset откатит все ваши миграции приложений:

php artisan migrate:reset

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

Команда migrate: refresh откатит все ваши миграции и выполнит команду migrate. Эта команда эффективно воссоздает всю вашу базу данных:

php artisan migrate:refresh

//Обновите базу данных и запустите все семплы базы данных... php artisan migrate:refresh --seed

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

php artisan migrate:refresh --step=5

Удалить все таблицы и перенести

Команда migrate: fresh выведет все таблицы из базы данных и выполнит команду migrate:

php artisan migrate:fresh

php artisan migrate:fresh --seed

Ещё вопросы

Сообщество Overcoder
Наверх
Меню