Laravel에서 특정 마이그레이션 하나를 롤백


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_directoriescontacts의도 와 내 테이블 모두 나는 그런 일이 일어나기를 원하지 않으며, 그 특정한 일만 롤백 할 수 있다면이 재난은 결코 일어나지 않을 것입니다.


46
공감! 그냥 당신 이이 질문을 쓴 방식으로 :)
Sliq

난 그냥 수를 변경 그냥 롤백 할 수 있도록 나는 그것이 나를 배치 번호를 변경할 수 sqlpro 사용하고

향후 롤백을 고려할 때 'php artisan migrate --step'을 사용하여 단계별로 각 마이그레이션을 실행하십시오. php artisan migrate를 실행할 때 한 번의 마이그레이션 만 롤백합니다. 롤백
James

답변:


146

migrations표 를 살펴보면 각 마이그레이션에 배치 번호가 있음을 알 수 있습니다. 따라서 롤백 할 때 마지막 배치의 일부인 각 마이그레이션을 롤백합니다.

마지막 마이그레이션 만 롤백하려면 배치 번호를 1 씩 늘리십시오. 그런 다음 다음에 rollback명령 을 실행할 때 자체 "일괄 처리"에있는 한 번의 마이그레이션 만 롤백합니다.


좋은 추천! 배치 번호를 편집하려고 시도했지만 알려주지 않습니다. 일종의 잠금 장치이며 회색으로 표시됩니다. Mac의 MySQL WorkBench에서 시도했습니다. 그것에 대한 아이디어가 있습니까?
cyber8200

배치 번호를 구성하려고 할 때 배치 번호가 잠금 인 이유를 알고 있습니까?
cyber8200

1
다음과 같은 쿼리로 마이그레이션 테이블에서 배치 번호를 업데이트하십시오. UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan

3
@ImranKhan 배치 번호를 '2'로 하드 코딩하는 것은 배치가 두 개 이상인 경우 특히 좋지 않습니다.
Martin Bean

Sequel Pro (Mac OS 만 해당)를 사용하여 마이그레이션 테이블을 쉽게 편집하고 배치 번호를 변경하십시오.
Arslan Ramay

271

라 라벨 5.3+

한 단계 롤백. 기본적으로.

php artisan migrate:rollback --step=1

다음은 매뉴얼 페이지입니다. docs .


라 라벨 5.2 이전

번거 로움 없이는 할 수 없습니다. 자세한 내용은 Martin Bean의 답변을 확인하십시오 .


1
OP가 개발중인 버전의 라라 벨로 애플리케이션을 작성하지 않는 한 유용하지 않습니다.
Martin Bean

4
이것은 좋은 기능이지만 롤백 할 마이그레이션을 지정 하는 기능이 없습니다 . 마이그레이션 테이블에 마지막으로 나열된 것으로 가정합니까? 마이그레이션 할 때는 일반적 으로 롤백 할 계획 이 없으므로 마지막 마이그레이션 인 롤백 할 가능성은 그리 높지 않습니다. 라 라벨이이 공을 떨어 뜨린 것 같습니다. 단일 마이그레이션을 롤백하는 유일한 안전한 방법은 마이그레이션 테이블을 수동으로 편집하는 것입니다.
스키트

@ SkeetsO'Reilly Agreed, 마이그레이션은 그리 잘 생각되지 않습니다. 그러나 여기에 있으므로 처음부터 마이그레이션 패키지를 찾지 않아도됩니다.
Yauheni Prakopchyk

그것은 매력처럼 작동했습니다. 새 마이그레이션을 개발하고 (기존 테이블에 열 추가) "uuid"유형으로 마이그레이션하는 것을보고 "string"을 원했습니다. 롤백 팁이 완벽하게 작동했습니다. 롤백. 업데이트 코드. 다시 마이그레이션하십시오. => 100 % 괜찮습니다. Laravel 5.7
Florian Doyen

(php artisan) 명령 줄로 마지막 N 마이그레이션 단계를 어떻게 가져올 수 있습니까? 원하는 경우 db를 찾아 내 마이그레이션 테이블과 쿼리를 찾아 내 기록과 마지막으로 실행 한 마이그레이션을 가져올 수 있습니다. 그러나 다른 한편으로, 새로운 마이그레이션이 항상 정렬되지 않았기 때문에 항상 마이그레이션 폴더를 사용할 수 없습니다. 이 문제에 대해서는 단지 우리가 php artisan make : migration을 사용하고 기존 파일의 중간에서 마이그레이션 파일의 사본을 사용하지 않는 것이 좋습니다.
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는 조금 늦었지만 UI를 사용하여 편집 할 수없는 이유는 테이블 마이그레이션에 기본 키가 없기 때문입니다. 직접 편집하려면 SQL을 작성해야합니다.
Vic

15

새로 고침 마이그레이션 을 사용하는 것이 좋습니다

단계 옵션을 refresh 명령에 제공하여 제한된 수의 마이그레이션을 롤백 및 다시 마이그레이션 할 수 있습니다. 예를 들어 다음 명령은 마지막 두 마이그레이션을 롤백하고 다시 마이그레이션합니다.

php artisan migrate:refresh --step=2

그렇지 않으면 사용 된 롤백 마이그레이션

롤백 명령에 단계 옵션을 제공하여 제한된 수의 마이그레이션을 롤백 할 수 있습니다. 예를 들어 다음 명령은 마지막 세 가지 마이그레이션을 롤백합니다.

php artisan migrate:rollback --step=3

마이그레이션에 대한 자세한 내용


11

가장 좋은 방법은 새로운 마이그레이션을 생성하고 필요한 변경을 수행하는 것입니다.

최악의 경우는 해결 ( 경우에 당신은 DB에 액세스 할 수 플러스 당신이 그 테이블의 데이터의 RESET과 괜찮아 ) :

  1. DB로 이동 하여 마이그레이션 항목 삭제 / 이름 바꾸기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
Thiago Valente

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

이러한 기술을 사용하면 데이터베이스 및 스키마에 대한 수정 사항을보다 유연하게 제어 할 수 있습니다.


라 라벨 문서가 올바르지 않은 경우 "--step = 3"은 마지막 마이그레이션 실행이 아니라 마지막 3 개의 마이그레이션을 롤백한다는 의미 입니다. 마이그레이션을 다른 폴더에 넣는 것이 전혀 바뀌지 않을지 모르겠지만 기대하지는 않습니다. 이름으로 롤백을 지정하면 효과가 있습니다! 그러나 인수를 롤백하면 "너무 많은 인수"가 표시됩니다.
스키트

4

한 단계 롤백. 기본적으로.

php artisan migrate:rollback --step=1

2 단계 롤백 기본적으로.

php artisan migrate:rollback --step=2


4

마지막 마이그레이션을 롤백하려는 경우.

php artisan migrate:rollback

특정 마이그레이션을 롤백하려면 마이그레이션 테이블로 이동하여 해당 레코드의 최대 값을 일괄 적으로 설정하십시오. 그때.

php artisan migrate:rollback

현재 다른 버전의 laravel을 사용하지 않으면 laravel 5.8로 작업 중입니다.


나에게 유용했다. 마지막 마이그레이션과 같은 경우입니다.
CodeToLife

3

테이블을 하나씩 마이그레이션하십시오.

롤백하려는 마이그레이션의 배치 번호를 최고로 변경하십시오.

migrate : rollback을 실행하십시오.

대규모 프로젝트를 처리하는 가장 편안한 방법이 아닐 수 있습니다.


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.
Aleksandar

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

DB에 액세스 할 수 있으면 더 쉬운 솔루션이 있습니다. 마이그레이션 테이블 에서 레코드를 삭제 한 다음 테이블을 삭제하면 됩니다. SQL 클라이언트와 함께.

그리고 사용할 수 있습니다

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

많은 답변처럼. 그리고 경로는 위치입니다. 이와 같은 모듈 마이그레이션도 제거 할 수 있습니다. (어쨌든 모든 마이그레이션)

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

Linux 서버를 사용하는 경우 대소 문자 구분에주의하십시오. 시작 자본으로 / Database / Migrations 를 추가해야합니다 .

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.