đặt lại trạng thái hook_update_n của mô-đun


14

Tôi đang mở rộng một mô-đun mà tôi đã viết trước đây và nó cần một số thay đổi lược đồ mà tôi triển khai hook_update_N.

Tôi đã cập nhật phiên bản của mô-đun từ 7.x-1.0đến 7.x-1.1và triển khai foo_update_7100và nó hoạt động tốt.

Vấn đề là tôi đã mắc một lỗi bên trong foo_update_7100và bây giờ tôi đã sửa nó, tôi không thể chạy lại bản cập nhật 7100. Tôi cần tạo một 7101 nhưng điều đó không có ý nghĩa vì tất cả các thay đổi của tôi chưa được cam kết.

Tôi đã thử thiết lập lại trạng thái của hook_update_n thông qua:

update system set schema_version=-1 where name='foo';

> Query OK, 1 row affected (0.01 sec)
> Rows matched: 1  Changed: 1  Warnings: 0

Sau đó, tôi làm drush cc allnhưng drush updatedb -yvẫn cho tôi "Không cần cập nhật cơ sở dữ liệu".

Làm thế nào tôi có thể giải quyết điều này thay vì chỉ đơn giản là tăng hook_update_Nsố lượng?


1
Hãy thử đặt thành 0 thay vì -1.
Andy

Cảm ơn. Điều đó đã làm việc. Tôi nên đã xem mô tả cột trong đó đề cập rõ ràng -1có nghĩa là mô-đun không được cài đặt. Hãy gửi bài đó như một câu trả lời để tôi có thể chấp nhận.
cherouvim

Câu trả lời:


14

Đặt nó thành 0 sẽ hoạt động. system_schema()nói giá trị nên là:

-1 nếu mô-đun không được cài đặt (các bảng của nó không tồn tại); 0 hoặc N lớn nhất của hàm hook_update_N () của mô-đun đã được chạy hoặc tồn tại khi mô-đun được cài đặt lần đầu tiên.


1
Trên thực tế, điều này sẽ chỉ hoạt động nếu đây là hook cập nhật duy nhất; thông thường, điều này sẽ khiến tất cả các móc cập nhật chạy lại. Sẽ an toàn hơn khi đặt giá trị thành 1 dưới số móc cập nhật bạn cần chạy lại (và mọi móc nối có số tiếp theo cũng sẽ chạy).
Eelke Blok

Có một lý do nào đó -1sẽ hiển thị cho một mô-đun mà Drupal nói được kích hoạt không?
cdmo

6

FYI, trong Drupal 8, bảng hệ thống đã bị xóa và thông tin này hiện được lưu trữ trong bảng key_value .

UPDATE key_value SET value='i:8000;' WHERE collection = 'system.schema' AND name = 'module_name';

(Như đã lưu ý ở trên, giá trị thực phải nhỏ hơn hook_update_N () bạn muốn lặp lại, nhưng cao hơn hoặc khớp với bản cập nhật cuối cùng không cần lặp lại.)


3

Tôi đã làm điều này rất nhiều đến nỗi cuối cùng tôi đã viết một mô-đun drush để quay lại phiên bản cập nhật trong bảng hệ thống. Được gọi là "uroll" để cập nhật rollback.

https://github.com/danshumaker/drush-uroll

Cách sử dụng: drush uroll --module = mycustomaticule --version = 5

Nó siêu đơn giản nhưng tôi sử dụng nó mọi lúc. Điều này kết hợp với một kịch bản tải lại sao lưu cơ sở dữ liệu cho phép bạn rửa và lặp lại khi viết các chức năng cập nhật.

Hy vọng hữu ích cho bạn. Chúc may mắn.


Tuyệt vời! Drupal 7 hay Drupal 8?
Ignacio Segura Postigo

1
D7 chỉ cho bây giờ.
Dan Shumaker

Đó là một thứ tốt. Giúp tôi với. Chỉ cần làm rõ nếu hook_update_N của tôi giống như mymodule_update_7000 thì trong lệnh uroll drush của bạn cho phiên bản tôi có thể đặt 0. Tôi có đúng không?
Austin

1
@Kamal Xin lỗi tôi nên tài liệu tốt hơn. Nếu hook hiện tại của bạn đang ghi hook_update_N là 7300 thì bạn sẽ đưa ra uroll --module=mymodule --version=7299 Điều này đặt bảng sys ở một trước bạn. Do đó, trên dbup tiếp theo, 7300 của bạn sẽ được chạy. Vì vậy, không, đừng chỉ đưa ra hai chữ số cuối cùng mà là toàn bộ số vượt quá mymodule_update_bất cứ thứ gì có thể là 9123667 .. :) @Eelke cũng có một mô tả hay trong câu trả lời của anh ấy.
Dan Shumaker

0

Để có được bản cập nhật hook của bạn chạy lại, bạn nên đặt lược đồ_version thành 1 bên dưới số thứ tự của hook của bạn .

Về mặt kỹ thuật, bất cứ điều gì bên dưới hook bạn muốn chạy lại và trên hook cập nhật mà bạn không cần / muốn chạy lại (nhưng ít nhất là 0; -1 có nghĩa là mô-đun chưa được cài đặt) là OK; nếu không có móc cập nhật nào khác, điều đó có nghĩa là thậm chí 0 nằm giữa các ranh giới đó, nhưng trong trường hợp điển hình, móc cập nhật được tăng thêm một, do đó, chỉ giảm 1 mức thấp là lựa chọn an toàn duy nhất nếu bạn không muốn chạy thêm mã hơn móc cập nhật cao nhất hiện nay.

Quá trình cập nhật chỉ cần kiểm tra giá trị đó và xem liệu có bất kỳ hook cập nhật nào có số thứ tự cao hơn không. Nếu vậy, nó sẽ chạy chúng theo trình tự. (Điều này cũng có nghĩa là quá trình cài đặt đặt phiên bản lược đồ tương ứng với hook cập nhật khả dụng cao nhất; nó giả định rằng khi cài đặt, mô-đun của bạn sẽ có trạng thái tương ứng với hook cập nhật cuối cùng đó).

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.