किसी मॉड्यूल के हुक_अपडेट_न स्थिति को रीसेट करना


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
-1 के बजाय इसे 0 पर सेट करने का प्रयास करें।
एंडी

धन्यवाद। वह काम किया। मुझे कॉलम विवरण को देखना चाहिए जिसमें स्पष्ट रूप से उल्लेख किया गया है कि -1इसका मतलब है कि मॉड्यूल स्थापित नहीं है। बेझिझक पोस्ट करें कि एक उत्तर के रूप में इसलिए मैं स्वीकार कर सकता हूं।
चेरोविम

जवाबों:


14

इसे 0 पर सेट करना चाहिए। system_schema()मान होना चाहिए:

-1 यदि मॉड्यूल स्थापित नहीं है (इसके टेबल मौजूद नहीं हैं); मॉड्यूल के Hook_update_N () फ़ंक्शन का 0 या सबसे बड़ा N जो मॉड्यूल पहली बार स्थापित होने पर चलाया गया है या मौजूद है।


1
वास्तव में, यह केवल तभी काम करेगा जब यह एकमात्र अपडेट हुक हो; आमतौर पर, इससे सभी अपडेट हुक फिर से चलेंगे। यह उस अद्यतन हुक की संख्या के नीचे 1 को मान सेट करने के लिए सुरक्षित है जिसे आपको पुन: चलाने की आवश्यकता है (और बाद के नंबरों के साथ कोई भी हुक भी चलेगा)।
इलके ब्लोक

क्या कोई ऐसा कारण है जो -1एक मॉड्यूल के लिए दिखाई देगा जो ड्रुपल कहते हैं कि सक्षम है?
cdmo

6

FYI करें, Drupal 8 में, सिस्टम तालिका को हटा दिया गया है, और यह जानकारी अब key_value तालिका में संग्रहीत है ।

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

(जैसा कि ऊपर उल्लेख किया गया है, वास्तविक मूल्य हुक_अपडेट_ से कम होना चाहिए ) () आप दोहराना चाहते हैं, लेकिन पिछले अपडेट से अधिक या मेल खाते हैं जिन्हें दोहराए जाने की आवश्यकता नहीं है।)


3

मैंने इतना किया कि मैंने सिस्टम तालिका में अद्यतन संस्करण को वापस रोल करने के लिए एक ड्रश मॉड्यूल लिखना समाप्त कर दिया। अद्यतन रोलबैक के लिए "यूरोल" कहा जाता है।

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

उपयोग: drush uroll --module = mycustommodule --version = 5

यह सुपर सरल है लेकिन मैं हर समय इसका उपयोग करता हूं। यह एक डेटाबेस बैकअप रीलोड स्क्रिप्ट के साथ संयुक्त है जो आपको अपडेट फ़ंक्शन लिखते समय कुल्ला और दोहराता है।

आशा है कि आप के लिए उपयोगी है। सौभाग्य।


बहुत बढ़िया! Drupal 7 या Drupal 8?
इग्नासियो सेगुरा पोस्टिगो

1
अभी के लिए डी 7।
डैन शुमेकर

यह बेहतर है। मेरी मदद की। केवल स्पष्टीकरण के लिए अगर मेरा हुक_अपडेट_ mymodule_update_7000 जैसा है, तो संस्करण के लिए आपके ड्रश uroll कमांड में मैं 0. डाल सकता हूं क्या मैं सही हूं?
ऑस्टिन

1
@ कमाल मुझे माफ करना, मुझे इसे बेहतर तरीके से प्रलेखित करना चाहिए। यदि वर्तमान हुक आपका कर रहा है, हुकिंग_अपडेटा at you you३ पर है तो आप यूरोल देंगे --module=mymodule --version=7299 जो आपके सामने एक पर sys टेबल सेट करता है। इस प्रकार अगले dbup पर आपका 7300 रन हो जाता है। तो, नहीं, इसे केवल अंतिम दो अंक न दें, बल्कि पूरी संख्या अतीत mymodule_update_जो कि 9123667 हो सकती है .. :) @Eelke का उसके उत्तर में भी अच्छा वर्णन है।
डैन शुमेकर

0

अपने अपडेट हुक को फिर से चलाने के लिए, आपको अपने हुक के अनुक्रम संख्या के नीचे स्कीमा_वर्सन को 1 पर सेट करना चाहिए ।

तकनीकी रूप से, हुक के नीचे की कोई भी चीज़ जो आप पुनर्मूल्यांकन करना चाहते हैं और अपडेट हुक के ऊपर आपको पुनर्मिलन करने की आवश्यकता नहीं है / चाहते हैं (लेकिन कम से कम 0; -1 का मतलब है मॉड्यूल स्थापित नहीं है) ठीक है; यदि कोई अन्य अपडेट हुक नहीं हैं, तो इसका मतलब है कि उन सीमाओं के बीच भी 0 गिरता है, लेकिन विशिष्ट मामले में, अपडेट हुक एक से बढ़ जाते हैं, इसलिए केवल 1 लोअर ही एकमात्र सुरक्षित विकल्प है यदि आप अधिक कोड नहीं चलाना चाहते हैं वर्तमान उच्चतम अपडेट हुक की तुलना में।

अद्यतन प्रक्रिया बस उस मान की जांच करती है, और यह देखती है कि क्या उच्च अनुक्रम संख्या के साथ कोई अपडेट हुक हैं या नहीं। यदि हां, तो यह उन्हें क्रम से चलाएगा। (इसका अर्थ यह भी है कि इंस्टॉलेशन प्रक्रिया स्कीमा संस्करण को उस उच्चतम उपलब्ध अपडेट हुक के अनुरूप सेट करती है; यह मानती है कि इंस्टॉलेशन के समय, आपके मॉड्यूल में उस अंतिम अपडेट हुक के अनुरूप स्थिति होगी)।


0

जो अभी भी एक उत्तर की तलाश में है, आप इसे 3 तरीकों से प्राप्त कर सकते हैं:

  • SQL: UPDATE सिस्टम SET स्कीमा_version = [N *] जहां नाम = '[मॉड्यूल का नाम]';

  • Drush: drush ev "drupal_set_installed_schema_version ('[मॉड्यूल का नाम]', [N *]"

  • ड्रश यूरोल ड्रश यूरोल - मोडुले = [मॉड्यूल का नाम] --version = N *

* एन अपडेट फ़ंक्शन जिसे आप वापस करना चाहते हैं (यानी अंतिम सफल अपडेट फ़ंक्शन)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.