Відкат одна конкретна міграція в Ларавелі


238

я хочу

лише до відкату:

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і мій contactsстіл ненавмисно. Я ніколи не хочу, щоб це сталося, і якщо я зможу відкатати лише той конкретний, цього катастрофи ніколи не станеться.


46
піднести! як раз для того, як ви написали це запитання :)
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
Це було б хорошою особливістю, але в ньому відсутня функціональність, щоб вказати, яку з міграцій відкатати. Я припускаю, що це лише останній, зазначений у таблиці міграцій? Коли я мігрую речі, я зазвичай не планую відкочуватися назад, тому шанси міграції, яку я хочу відкотити назад, є не дуже високою. Здається, що ларавел начебто скинув кулю на цьому. Єдиний безпечний спосіб повернути одну міграцію - це, можливо, редагувати таблицю міграції вручну.
Skeets

@ SkeetsO'Reilly Погоджено, міграції не надто добре продумані. Але вони є тут, тому вас не змусять шукати міграційний пакет з самого початку.
Яухені Пракопчик

Це спрацювало як шарм. Я розробляв нову міграцію (додав стовпчик до існуючої таблиці), потім побачив, що мігрував з типом "uuid", хотів "рядок". Ваш відгук про відкат добре працював. Відкат. Оновити код. Знову мігруйте. => 100% гаразд. Laravel 5.7
Флоріан Дойен

Як я можу отримати останні N кроків міграції за допомогою (php artisan) командного рядка. якщо я хочу, я можу шукати db і знайти свою таблицю міграції та запит, щоб отримати мою історію та останню міграцію, яка працює. але з іншого боку, я не можу завжди використовувати свою папку міграції, оскільки нова міграція не завжди сортується. для цієї проблеми я просто рекомендую використовувати php artisan make: міграція і не використовувати копію файлів міграції з середини цих існуючих файлів.
saber tabatabaee yazdi

24

Щоразу при відкаті ви отримуєте останню партію міграції. використовувати команду

php artisan migrate:rollback --step=1

18

Якщо ви не можете зробити те, що вам сказало @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');
    });
}

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


Дякую за вашу відповідь, але я все налаштований на це. Швидке запитання для вас, чи знаєте ви, чому я не можу редагувати пакетний стовпчик своєї міграційної таблиці?
cyber8200

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

15

краще використати refresh migrate

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

php artisan migrate:refresh --step=2

інакше використаний відкат мігрує

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

php artisan migrate:rollback --step=3

Детальніше про міграцію див


11

Найкращий спосіб - створити нову міграцію та внести необхідні зміни в неї.

Найгірший випадок ( якщо у вас є доступ до БД плюс ви не в порядку з RESET даних цієї таблиці ):

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

Це змусить 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-й до останнього запуску міграції. Я не знаю, чи зміна міграцій у різні папки змінила б це взагалі, але я не очікував цього. Якщо вказати відкат за назвою, це буде чудово! Якщо ви даєте відкат будь-яких аргументів, він скаржиться на "занадто багато аргументів".
Skeets

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

У цьому випадку це не допоможе, оскільки воно відкине певну кількість міграцій, а не одну вказану міграцію. "--step3" все одно поверне всі 3 міграції.
Skeets

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.