Di chuyển an toàn trong Laravel


206

Trong Laravel, dường như có một lệnh để tạo di chuyển, nhưng không xóa.

Tạo lệnh di chuyển:

php artisan migrate:make create_users_table

Nếu tôi muốn xóa di chuyển, tôi có thể xóa tệp di chuyển tương ứng trong thư mục cơ sở dữ liệu / di chuyển không?

Tập tin di chuyển:

2013_05_31_220658_create_users_table

Câu trả lời:


375

Tôi vô tình tạo một di chuyển với một tên xấu (lệnh php artisan migrate:make:). Tôi không chạy ( php artisan migrate) di chuyển, vì vậy tôi quyết định loại bỏ nó. Các bước của tôi:

  1. Xóa thủ công tệp di chuyển trong app/database/migrations/my_migration_file_name.php
  2. Đặt lại các tập tin tự động tải của nhà soạn nhạc: composer dump-autoload
  3. Thư giãn

Nếu bạn đã chạy di chuyển ( php artisan migrate), bạn có thể làm điều này:

a) Chạy migrate:rollback- đó là cách đúng đắn để hoàn tác việc di chuyển cuối cùng (Thnx @Jakobud)

b) Nếu migrate:rollbackkhông hoạt động, hãy thực hiện thủ công (Tôi nhớ các lỗi với di chuyển: rollback trong các phiên bản trước):

  1. Xóa thủ công tệp di chuyển trong app/database/migrations/my_migration_file_name.php
  2. Đặt lại các tập tin tự động tải của nhà soạn nhạc: composer dump-autoload
  3. Sửa đổi cơ sở dữ liệu của bạn: Xóa mục nhập cuối cùng khỏi bảng di chuyển

2
Cảm ơn. Gottcha cho tôi sau khi xóa di chuyển đã quên chạy trình soạn thảo dump-autoload
Theo Kouzelis

7
Nếu bạn đã chạy di chuyển, cách "thích hợp" là chạy migrate:rollbackđể khôi phục di chuyển, sau đó xóa tệp di chuyển và tự động tải. Không cần phải hack db hoặc bảng di chuyển.
Jake Wilson

câu trả lời tuyệt vời cho các bước sau (php artisan di chuyển) (Y)
Imran Khan

Chúa và tôi dằn vặt bản thân khi tôi sai. Cảm ơn bạn.
Pablo Tương phản

4. Xóa bảng thực tế khỏi DB
Jin

64

Nếu quá trình di chuyển đã được chạy (đọc: đã di chuyển) thì bạn nên quay lại quá trình di chuyển của mình để xóa lịch sử khỏi bảng cơ sở dữ liệu của bạn. Khi bạn quay trở lại, bạn sẽ có thể xóa tệp di chuyển của mình một cách an toàn và sau đó tiến hành di chuyển lại.


Anh ấy đã không chạy di chuyển, mặc dù. Bạn không thể quay lại những gì bạn đã không thực sự làm, phải không?
Stephane

9
Không, bạn không thể, nhưng nếu đó là trường hợp thì sẽ không có lịch sử được lưu trữ trong cơ sở dữ liệu di chuyển, điều đó có nghĩa là bạn có thể xóa tệp một cách an toàn.
Jason Lewis

14
 php artisan migrate:fresh

Nên làm công việc, nếu bạn đang trong quá trình phát triển và kết quả mong muốn là bắt đầu lại tất cả.

Trong sản xuất, đó có thể không phải là điều mong muốn, vì vậy bạn nên được quảng cáo. (Lệnh di chuyển: lệnh tươi sẽ thả tất cả các bảng khỏi cơ sở dữ liệu và sau đó thực hiện lệnh di chuyển).


5
3 upvote? OP yêu cầu một cách để xóa di chuyển, không phá hủy và làm mới toàn bộ cơ sở dữ liệu. Đây là lời khuyên tồi tệ, đừng làm điều này trừ khi bạn biết bạn đang làm gì.
Tạm biệt

vui lòng đọc về sự khác biệt giữa di chuyển: làm mớidi chuyển: mới mà bạn thấy là mô tả đầu tiên, sau này theo cách nào đó thiết lập lại một phần tránh công việc thủ công!
tham gia

1
di chuyển: tươi ngay lập tức giảm TẤT CẢ các bảng và chạy lại di chuyển như thể chạy lần đầu tiên. Không có gì một phần về nó .. mọi dữ liệu sẽ biến mất. Nó sẽ khắc phục vấn đề nhưng nó không phải là một câu trả lời hợp lệ cho câu hỏi.
Tạm biệt

12

Bạn cũng có thể cần phải xóa mục từ bảng di chuyển.


7

Tôi đã vô tình tạo hai lần created_users_table. Nó đã ghi đè một số lớp và biến rollback thành ErrorException.

Những gì bạn cần làm là tìm autoload_groupmap.php trong thư mục nhà cung cấp / nhà soạn nhạc và tìm dòng mã cụ thể như

'CreateUsersTable' => $baseDir . '/app/database/migrations/2013_07_04_014051_create_users_table.php',

và chỉnh sửa đường dẫn. Sau đó, rollback của bạn sẽ ổn.


Nếu bạn - như tôi đã làm - chỉ cần đi và đổi tên một tệp di chuyển thì đây là câu trả lời bạn đang tìm kiếm! Cảm ơn.
Berdus

2
Bạn cũng có thể chỉ cần làm "trình soạn thảo dumpautoload"
FooBar

5

Tôi đồng ý với các câu trả lời hiện tại, tôi chỉ muốn thêm ít thông tin hơn.

Một tính năng mới đã được thêm vào phiên bản Laravel 5.3 trở lên cho phép bạn sao lưu một lần di chuyển:

php artisan migrate:rollback --step=1

sau đó, xóa thủ công tệp di chuyển bên dưới database/migrations/my_migration_file_name.php

Đây là một tính năng tuyệt vời khi bạn chạy di chuyển

Bằng cách này, bạn có thể xóa di chuyển trong laravel một cách an toàn chỉ trong 2 bước


0

Tôi sẽ làm điều đó bằng tay

  1. Xóa mô hình trước (nếu bạn không) cần mô hình nữa
  2. Xóa di chuyển khỏi ...database/migrationsthư mục
  3. Nếu bạn đã di chuyển tức là nếu bạn đã chạy php artisan migrate, hãy đăng nhập vào phpmyadmin hoặc SQL của bạn (bất kể trường hợp nào) và trong cơ sở dữ liệu của bạn, hãy xóa bảng được tạo bởi quá trình di chuyển
  4. Vẫn trong cơ sở dữ liệu của bạn, trong thư mục di chuyển, xác định hàng với tên tệp di chuyển đó và xóa hàng.

Làm việc cho tôi, hy vọng nó sẽ giúp!


-2

Điều này làm việc cho tôi:

  1. Tôi đã xóa tất cả các bảng trong cơ sở dữ liệu của mình, chủ yếu là bảng di chuyển.
  2. php artisan migrate:refresh

trong ấu trùng 5.5.43

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.