Phục hồi một di chuyển cụ thể trong Laravel


238

tôi muốn

để quay lại chỉ:

Rolled back: 2015_05_15_195423_alter_table_web_directories


tôi chạy

php artisan migrate:rollback, 3 cuộc di cư của tôi đang quay trở lại.

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

Tôi xóa

cả tôi web_directoriescontactsbàn của tôi vô tình. Tôi không bao giờ muốn điều đó xảy ra, và nếu tôi chỉ có thể quay lại cái cụ thể đó, thảm họa này sẽ không bao giờ xảy ra.


46
nâng cao! chỉ vì cách bạn viết câu hỏi này :)
Sliq

Tôi đang sử dụng sqlpro, nó cho phép tôi thay đổi số lô, vì vậy tôi chỉ thay đổi số và chỉ quay lại
roll

Xem xét các lần quay lại trong tương lai, hãy sử dụng 'php artisan di chuyển --step' để chạy từng bước di chuyển, điều này sẽ chỉ khôi phục một lần di chuyển khi bạn chạy php artisan di chuyển: rollback
James

Câu trả lời:


146

Nếu bạn nhìn vào migrationsbảng của mình , thì bạn sẽ thấy mỗi lần di chuyển có một số lô. Vì vậy, khi bạn quay lại, nó sẽ quay trở lại mỗi lần di chuyển là một phần của đợt trước.

Nếu bạn chỉ muốn quay lại lần di chuyển cuối cùng, thì chỉ cần tăng số lô lên một. Lần sau bạn chạyrollback lệnh, nó sẽ chỉ quay lại một lần di chuyển như trong một đợt của riêng mình.


Đề nghị tốt! Tôi đã cố chỉnh sửa số lô, nó sẽ không cho tôi. Đó là loại khóa, và màu xám. Tôi đã thử điều đó trong MySQL WorkBench trên máy Mac của tôi. Bất cứ ý tưởng về điều đó?
cyber8200

Bạn có biết tại sao, số lô của tôi bị khóa khi tôi cố gắng định cấu hình chúng không?
cyber8200

1
Cập nhật số lô trong bảng di chuyển theo truy vấn như: UPDATE migrationsSET batch= 2 WHERE migration= 'name_of_the_migration';
Imran Khan

3
@ImranKhan Mã hóa số lô thành '2' không đặc biệt tuyệt vời nếu bạn có nhiều hơn hai lô.
Martin Bean

Sử dụng Sequel Pro (chỉ dành cho Mac OS) để dễ dàng chỉnh sửa bảng Di chuyển của bạn và thay đổi số lô.
Arslan Ramay

271

Ấu trùng 5.3+

Phục hồi một bước. Tự nhiên.

php artisan migrate:rollback --step=1

Và đây là trang hướng dẫn: docs .


Laravel 5.2 trở về trước

Không có cách nào để làm mà không gặp rắc rối. Để biết chi tiết, kiểm tra câu trả lời của Martin Bean .


1
Mặc dù vậy, không hữu ích trừ khi OP đã viết ứng dụng của mình với phiên bản đang phát triển của Laravel.
Martin Bean

4
Đây sẽ là một tính năng tốt, nhưng nó thiếu chức năng để xác định nhân công nhập cư để rollback. Tôi giả sử nó chỉ là cái cuối cùng được liệt kê trong bảng di chuyển? Khi tôi di chuyển mọi thứ, tôi thường không lập kế hoạch quay trở lại, vì vậy khả năng di chuyển mà tôi muốn quay trở lại là lần di chuyển cuối cùng không cao lắm. Có vẻ như loại ấu trùng đánh rơi quả bóng này. Cách duy nhất an toàn để khôi phục một di chuyển duy nhất là chỉnh sửa bảng di chuyển theo cách thủ công mà tôi cho là.
Xiên

@ SkeetsO'Reilly Đồng ý, di cư không phải là suy nghĩ cực kỳ tốt. Nhưng họ ở đây vì vậy bạn sẽ không bị buộc phải tìm gói di chuyển ngay từ đầu.
Yauheni Prakopchyk

Nó làm việc như một say mê. Tôi đang phát triển một di chuyển mới (thêm một cột vào một bảng hiện có), sau đó tôi thấy tôi đã di chuyển với loại "uuid", tôi muốn "chuỗi". Mẹo rollback của bạn làm việc hoàn hảo. Phục hồi. Cập nhật mã. Di chuyển một lần nữa. => 100% ok. Laravel 5.7
Florian Doyen

làm thế nào tôi có thể tìm nạp các bước di chuyển N cuối cùng của mình bằng dòng lệnh (php artisan). nếu tôi muốn, tôi có thể tìm cách db và tìm bảng di chuyển và truy vấn của mình để tìm nạp lịch sử và lần di chuyển cuối cùng của tôi chạy. nhưng mặt khác, tôi không thể luôn sử dụng thư mục di chuyển của mình vì di chuyển mới không phải lúc nào cũng được sắp xếp. Đối với vấn đề này, tôi chỉ khuyên chúng ta nên sử dụng php artisan make: di chuyển và không sử dụng bản sao của các tệp di chuyển từ giữa các tệp hiện có.
saber tabatabaee yazdi

24

Mỗi khi bạn quay trở lại, bạn sẽ nhận được đợt di chuyển cuối cùng. sử dụng lệnh

php artisan migrate:rollback --step=1

18

Nếu bạn không thể làm những gì được nói bởi @Martin Bean, thì bạn có thể thử một mẹo khác.

Tạo một di chuyển mới và trên tệp đó trong phương thức up () chèn phương thức down () của phương thức di chuyển mà bạn muốn khôi phục và phương thức down () chèn phương thức up ().

ví dụ: nếu di chuyển ban đầu của bạn là như thế này

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

sau đó trong tệp di chuyển mới làm điều này

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

và sau đó chạy di chuyển, nó sẽ xóa bảng. và nếu bạn một lần nữa muốn điều đó trở lại chỉ cần quay lại nó.


Cảm ơn câu trả lời của bạn, nhưng tôi đã sẵn sàng với điều này. Câu hỏi nhanh cho bạn, bạn có biết tại sao tôi không thể chỉnh sửa cột hàng loạt của bảng di chuyển của mình không?
cyber8200

1
@ihue hơi muộn nhưng lý do bạn không thể chỉnh sửa nó bằng UI là vì việc di chuyển bảng không có khóa chính. Bạn phải viết sql để tự chỉnh sửa nó.
Vic

15

tốt hơn để sử dụng làm mới di chuyển

Bạn có thể khôi phục và di chuyển lại một số lần di chuyển hạn chế bằng cách cung cấp tùy chọn bước cho lệnh refresh. Ví dụ: lệnh sau sẽ khôi phục & di chuyển lại hai lần di chuyển cuối cùng:

php artisan migrate:refresh --step=2

mặt khác được sử dụng di chuyển rollback

Bạn có thể khôi phục một số lượng di chuyển hạn chế bằng cách cung cấp tùy chọn bước cho lệnh rollback. Ví dụ: lệnh sau sẽ khôi phục ba lần di chuyển cuối cùng:

php artisan migrate:rollback --step=3

để biết thêm chi tiết về di chuyển, xem


11

Cách tốt nhất là tạo một di chuyển mới và thực hiện các thay đổi cần thiết trong đó.

Cách giải quyết trường hợp xấu nhất ( nếu bạn có quyền truy cập vào DB cộng với bạn vẫn ổn với RESET dữ liệu của bảng đó ):

  1. Chuyển đến DB và xóa / đổi tên mục nhập di chuyển choyour-specific-migration
  2. Thả bảng được tạo bởiyour-specific-migration
  3. Chạy php artisan migrate --path=/database/migrations/your-specific-migration.php

Điều này sẽ buộc laravel chạy di chuyển cụ thể đó vì không có mục nào về nó tồn tại trong lịch sử di chuyển của Laravel

CẬP NHẬT : Cách thức của Laravel (Cảm ơn, @ thiago-valente)

Chạy:

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

và sau đó:

php artisan migrate

Điều này sẽ chạy lại di chuyển cụ thể đó


4
Tôi đã sử dụng php artisan migrate:rollback --path=/database/migrations/your-specific-migration.phpVà cuối cùng php artisan migrate
Thiago Valente

8

Có thể hơi muộn để trả lời câu hỏi này nhưng đây là một cách rất tốt, sạch sẽ và hiệu quả để làm điều đó tôi cảm thấy. Tôi sẽ cố gắng hết sức có thể.

Trước khi tạo di chuyển của bạn, hãy tạo các thư mục khác nhau như vậy:

    database
       | 
       migrations
            |
            batch_1
            batch_2
            batch_3

Sau đó, khi tạo di chuyển của bạn chạy lệnh sau (sử dụng các bảng của bạn làm ví dụ):

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

hoặc là

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

hoặc là

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

Các lệnh trên sẽ tạo tệp di chuyển trong đường dẫn thư mục đã cho. Sau đó, bạn có thể chỉ cần chạy lệnh sau để di chuyển tệp của mình qua các thư mục được chỉ định.

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

* Lưu ý: Bạn có thể thay đổi batch_1 thành batch_2 hoặc batch_3 hoặc bất kỳ tên thư mục nào bạn đang lưu trữ các tệp di chuyển. Miễn là nó vẫn nằm trong thư mục cơ sở dữ liệu / di chuyển hoặc một số thư mục được chỉ định.

Tiếp theo nếu bạn cần quay ngược lại các lần di chuyển cụ thể của mình, bạn có thể quay lại theo đợt như hình dưới đây:

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

hoặc là

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

hoặc là

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

Sử dụng các kỹ thuật này sẽ cho phép bạn linh hoạt hơn và kiểm soát (các) cơ sở dữ liệu của bạn và mọi sửa đổi được thực hiện cho lược đồ của bạn.


Trừ khi tài liệu laravel không chính xác, "--step = 3" có nghĩa là nó sẽ quay trở lại 3 lần di chuyển cuối cùng , chứ không phải lần di chuyển thứ 3 đến lần cuối. Tôi không biết nếu việc di chuyển trong các thư mục khác nhau sẽ thay đổi điều đó, nhưng tôi không mong đợi điều đó. Nếu chỉ định rollback theo tên hoạt động, đó sẽ là tuyệt vời! Tuy nhiên, nếu bạn đưa ra bất kỳ đối số nào, nó sẽ phàn nàn "quá nhiều đối số".
Xiên

4

Phục hồi một bước. Tự nhiên.

php artisan migrate:rollback --step=1

Quay lại hai bước. Tự nhiên.

php artisan migrate:rollback --step=2


4

Nếu bạn muốn quay trở lại di chuyển cuối cùng.

php artisan migrate:rollback

Nếu bạn muốn khôi phục di chuyển cụ thể, hãy chuyển đến bảng di chuyển và đặt giá trị cao nhất của bản ghi đó theo lô. Sau đó.

php artisan migrate:rollback

Hiện tại tôi đang làm việc trên laravel 5.8 nếu không hoạt động bất kỳ phiên bản laravel nào khác xin vui lòng thông báo cho tôi.


là hữu ích cho tôi. Chính xác là một trường hợp như vậy với lần di chuyển cuối cùng.
CodeToLife

3

Di chuyển từng bảng một.

Thay đổi số lô của di chuyển mà bạn muốn quay trở lại mức cao nhất.

Chạy di chuyển: rollback.

Có thể không phải là cách thoải mái nhất để đối phó với các dự án lớn hơn.


3

Nếu bạn muốn sửa đổi tệp di chuyển ban đầu và di chuyển lại, bạn có thể sử dụng gói này để di chuyển. (Áp dụng cho Laravel 5.4 trở lên)

Đầu tiên, cài đặt gói trong dự án Laravel của bạn:

composer require caloskao/migrate-specific

Đăng ký lệnh tại app/Console/Kernel.php:

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

Bây giờ, chạy lệnh này để di chuyển tệp của bạn

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

Điều này có thể đạt được bằng cách sử dụng php artisan:migrate --path=database/migrations/my_migration.php. Ngay trước khi bạn làm, hãy chắc chắn rằng migrationsbảng không có mục my_migration.
Aleksandar

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

một cái gì đó như thế này


1

1.) Bên trong cơ sở dữ liệu, đi đến bảng di chuyển và xóa mục nhập di chuyển liên quan đến bảng bạn muốn thả.

Ví dụ hình ảnh bảng di chuyển

2.) Tiếp theo, xóa bảng liên quan đến việc di chuyển mà bạn vừa xóa khỏi hướng dẫn 1.

Xóa ví dụ hình ảnh bảng

3.) Cuối cùng, thực hiện các thay đổi bạn muốn đối với tệp di chuyển của bảng bạn đã xóa khỏi hướng dẫn số. 2 sau đó chạy php artisan migrateđể di chuyển bảng một lần nữa.


0

Như đã nêu trong hướng dẫn sử dụng Laravel , bạn có thể quay lại số lần di chuyển cụ thể bằng --steptùy chọn

php artisan migrate:rollback --step=5

chỉ Laravel 5.3, vì vậy bất cứ điều gì được mã hóa dưới phiên bản mà không thể sử dụng nó
Jeffz

Điều này sẽ không giúp ích gì trong trường hợp của OP, vì nó sẽ phục hồi một số lần di chuyển nhất định, không phải là một lần di chuyển được chỉ định. "--step3" vẫn quay lại cả 3 lần di chuyển.
Xiên

0

Một lựa chọn khác cho những người được đề cập nếu bạn cần thực hiện việc này rất nhiều lần với cùng một lần di chuyển. Cá nhân tôi nghĩ rằng điều này thêm rất nhiều tính linh hoạt cho việc di chuyển của bạn.

Thêm vào database/migrationsđối tượng tự động tải của bạn trong composer.jsonnhư thế này:

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

Sau đó thêm namespace Database\Migrations;vào tất cả các tệp di chuyển của bạn.

Sau đó chạy $ composer dump-autoloadđể làm mới composer.locktập tin của bạn .

Sau đó, giả sử tên lớp của bạn cho việc di chuyển là AlterTableWebDirectories, bạn có thể tạo một lệnh như thế này:

$ php artisan make:command DropAlterTableWebDirectories

Và viết logic này trong handle()phương thức của bạn :

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

Điều này sẽ làm chính xác những gì bạn muốn. Nếu bạn muốn giảm số lượng di chuyển thay vì xóa nó, có lẽ bạn có thể tìm ra cách thay đổiDB:raw lệnh.

Lệnh này có thể được mở rộng để cho phép bạn tự động chọn di chuyển mà bạn thả nó bằng cách chuyển một đối số vào lệnh.

Sau đó, khi bạn đọc để di chuyển tệp đó một lần nữa, bạn có thể chạy php artisan migrate và nó sẽ chỉ di chuyển tệp đó.

Quá trình này cho phép bạn thực hiện các thay đổi cụ thể đối với việc di chuyển mà không phải thực hiện làm mới hoàn toàn và gieo hạt mỗi lần.

Cá nhân tôi cần phải làm điều đó rất nhiều vì hạt giống của tôi khá lớn.


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

0

Nếu bạn có quyền truy cập vào DB, bạn có một giải pháp dễ dàng hơn. Bạn có thể xóa bản ghi khỏi bảng di chuyển và sau đó chỉ cần thả bảng. với máy khách SQL.

Và có thể sử dụng

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

Giống như nhiều câu trả lời. Và nhớ đường dẫn là Vị trí. Bạn có thể loại bỏ ngay cả di chuyển mô-đun như thế này. (Bất kỳ di chuyển từ anywhare)

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

Và hãy nhớ, nếu bạn đang sử dụng máy chủ linux cẩn thận về độ nhạy trường hợp. Bạn phải thêm like / Cơ sở dữ liệu / Di chuyển với vốn bắt đầu.

/Database/Migrations/2020_05_15_xxxxxx_create_your_table.php
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.