การรีเซ็ตสถานะ hook_update_n ของโมดูล


14

hook_update_Nฉันขยายโมดูลผมเคยเขียนไว้ก่อนหน้านี้และจะต้องมีการเปลี่ยนแปลงสคีบางอย่างที่ผมดำเนินการใน

ฉันได้อัปเดตเวอร์ชันของโมดูลจาก7.x-1.0เป็น7.x-1.1และนำไปใช้foo_update_7100และทำงานได้ดี

ปัญหาคือฉันได้ทำผิดพลาดภายในfoo_update_7100และตอนนี้ฉันได้แก้ไขแล้วฉันไม่สามารถรันการอัพเดท 7100 อีกครั้งได้ ฉันต้องการสร้าง 7101 แต่ไม่เหมาะสมเพราะการเปลี่ยนแปลงทั้งหมดของฉันยังไม่ได้ทำ

ฉันพยายามรีเซ็ตสถานะของ hook_update_n ทาง:

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

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

จากนั้นทำdrush cc allแต่drush updatedb -yยังให้ "ไม่มีการอัพเดทฐานข้อมูลที่จำเป็น"

ฉันจะแก้ปัญหานี้แทนที่จะเพียงเพิ่มhook_update_Nจำนวนได้อย่างไร


1
ลองตั้งค่าเป็น 0 แทนที่จะเป็น -1
Andy

ขอบคุณ ที่ได้ผล ฉันควรเห็นคำอธิบายคอลัมน์ที่กล่าวถึงอย่างชัดเจนซึ่ง-1หมายความว่าโมดูลไม่ได้ติดตั้ง รู้สึกอิสระที่จะโพสต์ว่าเป็นคำตอบเพื่อให้ฉันสามารถยอมรับ
cherouvim

คำตอบ:


14

การตั้งค่าเป็น 0 ควรใช้งานได้ system_schema()บอกว่าค่าควรเป็น:

-1 ถ้าไม่ได้ติดตั้งโมดูล (ไม่มีตาราง) 0 หรือ N ที่ใหญ่ที่สุดของฟังก์ชัน hook_update_N () ของโมดูลที่ถูกเรียกใช้หรือมีอยู่เมื่อติดตั้งโมดูลเป็นครั้งแรก


1
ที่จริงแล้วจะใช้งานได้หากเป็นฮุกการอัพเดทเท่านั้น โดยทั่วไปนี่จะทำให้hooks การอัพเดททั้งหมดทำงานอีกครั้ง จะปลอดภัยกว่าหากตั้งค่าเป็น 1 ต่ำกว่าจำนวนของ hook การอัพเดทที่คุณต้องรันใหม่ (และ hooks ใด ๆ ที่มีหมายเลขถัดมาจะทำงานด้วย)
Eelke Blok

มีเหตุผลที่-1จะแสดงขึ้นสำหรับโมดูลที่ Drupal กล่าวว่าจะเปิดใช้งาน?
cdmo

6

FYI ใน Drupal 8 ตารางระบบได้ถูกลบออกและข้อมูลนี้จะถูกเก็บไว้ในตารางkey_value

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

(ตามที่ระบุไว้ข้างต้นค่าจริงควรน้อยกว่าhook_update_N () ที่คุณต้องการทำซ้ำ แต่สูงกว่าหรือตรงกับการอัพเดทล่าสุดที่ไม่จำเป็นต้องทำซ้ำ)


3

ฉันทำสิ่งนี้มากจนฉันเขียนโมดูล drush เพื่อย้อนกลับเวอร์ชันอัปเดตในตารางระบบ เรียกว่า "uroll" สำหรับการย้อนกลับการอัปเดต

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

การใช้งาน: drush uroll - โมดูล = mycustommodule --version = 5

มันง่ายมาก แต่ฉันใช้มันตลอดเวลา สิ่งนี้รวมกับสคริปต์โหลดฐานข้อมูลสำรองช่วยให้คุณสามารถล้างและทำซ้ำเมื่อเขียนฟังก์ชันการอัพเดท

หวังว่าจะเป็นประโยชน์กับคุณ โชคดี.


! น่ากลัว Drupal 7 หรือ Drupal 8?
Ignacio Segura Postigo

1
D7 เฉพาะตอนนี้
Dan Shumaker

มันเป็นสิ่งที่ดี ช่วยฉันด้วย เพียงเพื่อชี้แจงหาก hook_update_N ของฉันเป็นเหมือน mymodule_update_7000 จากนั้นในคำสั่ง druro uroll สำหรับรุ่นที่ฉันสามารถใส่ 0 ได้ไหม
ออสติน

1
@ Kamal ขออภัยฉันควรทำเอกสารให้ดีขึ้น หากเบ็ดปัจจุบันของคุณกำลังเขียน hook_update_N อยู่ที่ 7300 คุณจะให้ uroll --module=mymodule --version=7299 ซึ่งกำหนดตาราง sys ที่หนึ่งก่อนที่คุณจะ ดังนั้นใน dbup ครั้งต่อไปที่ 7300 ของคุณจะถูกเรียกใช้ ดังนั้นไม่เพียงแค่ให้ตัวเลขสองหลักสุดท้าย แต่ตัวเลขทั้งหมดผ่านmymodule_update_สิ่งที่อาจเป็น 9123667 .. :) @ Elke มีคำอธิบายที่ดีในคำตอบของเขาเช่นกัน
Dan Shumaker

0

ที่จะได้รับการปรับปรุงเบ็ดคุณทำงานอีกครั้งคุณควรตั้ง schema_version เพื่อที่ 1 ด้านล่างหมายเลขลำดับของเบ็ดของคุณ

ในทางเทคนิคสิ่งใดด้านล่างของ hook ที่คุณต้องการรันใหม่และเหนือ hook update ที่คุณไม่ต้องการ / ต้องการรันใหม่ (แต่อย่างน้อย 0; -1 หมายถึงโมดูลไม่ได้ติดตั้ง) ไม่เป็นไร หากไม่มี hooks การอัพเดทอื่น ๆ นั่นหมายความว่าแม้ 0 จะตกอยู่ระหว่างขอบเขตเหล่านั้น แต่ในกรณีทั่วไปตะขอการอัพเดทจะเพิ่มขึ้นทีละหนึ่งดังนั้นการไปที่ 1 ที่ต่ำกว่าจะเป็นตัวเลือกที่ปลอดภัยเท่านั้นหากคุณไม่ต้องการเรียกใช้รหัสเพิ่มเติม กว่าเบ็ดการอัพเดทสูงสุดในปัจจุบัน

กระบวนการอัปเดตจะตรวจสอบค่านั้นและดูว่ามี hooks การอัพเดทใด ๆ ที่มีหมายเลขลำดับสูงกว่าหรือไม่ ถ้าเป็นเช่นนั้นมันจะทำงานตามลำดับ (ซึ่งหมายความว่ากระบวนการติดตั้งจะตั้งค่าเวอร์ชันของสกีมาให้สอดคล้องกับ hook การอัพเดทสูงสุดที่มีอยู่ซึ่งถือว่าเมื่อทำการติดตั้งโมดูลของคุณจะมีสถานะที่สอดคล้องกับฮุกการอัพเดทล่าสุด)


0

สำหรับผู้ที่ยังคงมองหาคำตอบคุณสามารถทำได้ใน 3 วิธี:

  • SQL: ระบบ UPDATE SET schema_version = [N *] WHERE name = '[ชื่อของโมดูล]';

  • Drush: drush ev "drupal_set_installed_schema_version ('[ชื่อของโมดูล]', [N *])"

  • Drush uroll drush uroll --module = [ชื่อของโมดูล] - รุ่น = N *

* N เป็นฟังก์ชันอัปเดตที่คุณต้องการเปลี่ยนกลับ (เช่นฟังก์ชันอัปเดตที่สำเร็จครั้งล่าสุด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.