Tôi đã có một tình huống trong đó một bảng được tạo bởi một hàm cập nhật ( MYMODULE_update_7101
), nhưng bảng đó đã được truy cập bằng mã ở đâu đó trong mỗi bộ nhớ cache và hầu như mọi cuộc gọi drush (về cơ bản là lấy tên của các loại thực thể cho tất cả các menu và bất cứ thứ gì khác). Chạy drush updatedb
là chạy MYMODULE_update_7101
thứ ba thay vì đầu tiên.
Tôi đã thử giải pháp được đề xuất bởi @macaleaa và @moshe weitzman về việc chạy:
drush php-eval 'module_load_install('MYMODULE');MYMODULE_update_7101();'
trước khi chạy drush updatedb
, nhưng điều này không giúp được gì - việc chạy drush thất bại vì updatedb
đã thử chạy lại MYMODULE_update_7101()
và bị lỗi, nói rằng bảng đã tồn tại. Về cơ bản, đoạn mã trên đã chạy bản cập nhật, nhưng không để lại dấu ấn trên hệ thống mà bản cập nhật đã được chạy. Có lẽ có cả đống công việc khác update.php
phải làm sau khi chạy mỗi bản cập nhật để lưu số phiên bản mới nhất cho mô-đun trong db, v.v.
Tôi đã đi qua update.php
để xem làm thế nào nó thực sự chạy từng chức năng cập nhật và những gì nó làm sau đó, tìm kiếm một chức năng để gọi đó sẽ gọi chức năng cập nhật và cũng thực hiện tất cả các công cụ khác. Tôi đã kết thúc việc này:
include_once DRUPAL_ROOT . "/includes/update.inc";
$c["results"]["#abort"] = array();
update_do_one("MYMODULE", 7101, array(), $c);
Mà tôi thực sự chạy với drush:
drush eval 'include_once DRUPAL_ROOT . "/includes/update.inc"; $c["results"]["#abort"] = array(); update_do_one("MYMODULE", 7101, array(), $c);'
Nó chạy bản cập nhật, không có vấn đề gì, nhưng sau đó MYMODULE phiên bản 7101 vẫn hiển thị trong danh sách cập nhật khi tôi chạy updatedb
, ALTHOUGH nó chạy mà không bị lỗi và mọi thứ đều tốt khi kiểm tra trang web.
Một chút hack và trễ 6 năm, nhưng tất cả đều kết thúc tốt đẹp?