2015-06-11 6 views
5

मैं अपने डेटाबेस को अद्यतन करने के लिए Liquibase 3.3.5 का उपयोग कर रहा हूं। संदर्भ होने के कारण चेंजलॉग के विशिष्ट हिस्सों को निष्पादित करने का एक अच्छा तरीका है। लेकिन मुझे समझ में नहीं आ रहा है, क्यों सभी परिवर्तनों को निष्पादित किया जाता है, जब अद्यतन पर कोई संदर्भ प्रदान नहीं किया जाता है।अद्यतन पर निर्दिष्ट किए जाने पर सभी संदर्भ निष्पादित क्यों किए जाते हैं?

  • changeset एक:: निम्नलिखित उदाहरण पर विचार संदर्भ = परीक्षण
  • changeset बी: कोई संदर्भ
  • changeset सी: संदर्भ = prod

तो

  • साथ अद्यतन क्रियान्वित संदर्भ = परीक्षण, परिवर्तन ए + बी निष्पादित करेगा।
  • संदर्भ = प्रोड के साथ अद्यतन निष्पादित, परिवर्तन बी + सी निष्पादित करेगा।
  • कोई संदर्भ के साथ अद्यतन निष्पादित, परिवर्तन ए + बी + सी निष्पादित करेगा।

मेरे लिए, यह बिल्कुल समझ में नहीं आता है :)।

मैं उम्मीद करता हूं कि केवल परिवर्तन बी को निष्पादित किया जाएगा, क्योंकि यह एक विशिष्ट संदर्भ को परिभाषित नहीं करता है।

लिक्विबेस संदर्भों में उदाहरण: http://www.liquibase.org/documentation/contexts.html ("टेस्ट डेटा के लिए संदर्भों का उपयोग करना") वे कहते हैं कि किसी को "परीक्षण" के साथ परीक्षण के लिए परिवर्तनों को चिह्नित करना चाहिए, और टेस्टडेटा लागू करने के लिए संदर्भ "परीक्षण" देने के साथ उन्हें निष्पादित करना चाहिए। ठीक है - समझ में आता है। लेकिन

"जब आपके उत्पादन डेटाबेस को माइग्रेट करने का समय आता है, तो" परीक्षण "संदर्भ शामिल न करें, और आपका परीक्षण डेटा शामिल नहीं किया जाएगा। "

तो, अगर मैं निर्दिष्ट नहीं होता" परीक्षण परीक्षण "changesets रूप में अच्छी तरह से मैं बिल्कुल भी एक संदर्भ निर्दिष्ट नहीं किया है" जब उत्पादन अद्यतन को क्रियान्वित करने के संदर्भ में, यह पर अमल होगा ",।

फिर से, मैं उम्मीद होती है कि अद्यतन निष्पादन पर परीक्षण बाहर छोड़ रहा है, केवल नियमित changesets बिना परीक्षण changesets प्रदर्शन करेंगे।

या मैं यहाँ कुछ याद कर रहा हूँ :)?

उत्तर

7

यह वह जगह है कितना Liquibase काम करता है - अगर आप एक अद्यतन करते हैं और एक संदर्भ निर्दिष्ट नहीं करते हैं, तो सभी परिवर्तनों को उस अद्यतन ऑपरेशन के लिए लागू माना जाता है।

कुछ तरीकों से यह लागू किया जा सकता था, और विकास दल को एक चुनना पड़ा।

  1. यदि आप अद्यतन ऑपरेशन के दौरान कोई संदर्भ निर्दिष्ट नहीं करते हैं, तो कोई परिवर्तन नहीं माना जाता है।
  2. यदि आप कोई संदर्भ निर्दिष्ट नहीं करते हैं, तो सभी परिवर्तनों पर विचार किया जाता है।
  3. यदि आप कोई संदर्भ निर्दिष्ट नहीं करते हैं, तो केवल उन परिवर्तनों जिनमें कोई संदर्भ नहीं है, पर विचार किया जाता है।
  4. यदि आप कोई संदर्भ निर्दिष्ट नहीं करते हैं और किसी भी परिवर्तन में उनके पास संदर्भ नहीं हैं, तो सभी परिवर्तनों पर विचार किया जाता है, लेकिन यदि कुछ परिवर्तनों में संदर्भ हैं, तो ऊपर विकल्प 1, 2, या 3 पर जाएं।

टीम विकल्प 3 (जो आपकी अपेक्षा से मेल खाती है) के साथ चली गई थी लेकिन विकल्प 2 के साथ जाने के लिए बहुत पहले तय किया गया था, जैसा कि उस समय 'सर्वश्रेष्ठ' तरीका था। मैं उस समय टीम में नहीं था, इसलिए मुझे इससे ज्यादा कुछ नहीं पता।

+0

ठीक है, स्पष्टीकरण के लिए धन्यवाद :)! बदलना जो पीछे की संगतता को तोड़ देगा, यह निश्चित रूप से है। लेकिन एक नए उपयोगकर्ता के रूप में Liquibase, जो मुझे "प्राकृतिक" महसूस नहीं किया, इसलिए सवाल है। यदि आप हमेशा एक संदर्भ का उपयोग करते हैं, तो ऐसा लगता है कि ऐसा करना ठीक है। क्या उस व्यवहार को बदलने की कोई योजना है? – javg

+0

जैसा कि आपने देखा है, इसे बदलना पीछे की संगतता को तोड़ देगा, इसलिए इसे बदलने की संभावना बहुत कम है। दस्तावेज़ीकरण में सुधार करना फायदेमंद होगा। यदि आप रुचि रखते हैं, तो दस्तावेज गिटहब में है, और टीम पुल अनुरोधों का स्वागत करती है! https://github.com/liquibase/liquibase.github.com ps - अगर मेरा उत्तर सहायक था, तो कृपया इसे सही उत्तर के रूप में स्वीकार करें। – SteveDonie

1

यह @javg के लिए बहुत देर हो सकती है, लेकिन इससे भविष्य के पाठकों को लाभ हो सकता है। इस आवश्यकता के रूप में प्राप्त किया जा सकता है:

changeset A: context=test 
changeset B: context=all 
changeset C: context=prod 

तो

executing update with "context=test,all" will execute changeset A+B. 
executing update with "context=all,prod" will execute changeset B+C. 
executing update with "context=all" will only execute changeset B as you expect. 
1

मैं मुझ से समाधान जोड़ देगा (मेरे नजरिए से डिफ़ॉल्ट Liquibase व्यवहार सहज नहीं है)।

liquibase.setChangeLog("classpath*:liquibase/master.xml"); 
contexts = StringUtils.isBlank(contexts) ? "none" : contexts; 
liquibase.setContexts(contexts); 

यह संदर्भ 'कोई नहीं' और सभी डिफ़ॉल्ट परिवर्तन-सेट (परिवर्तन सेट के साथ सभी परिवर्तन सेट चलेंगे कि liquibase कारण: हमारी परियोजना "समस्या" से निपटने के लिए हम इस तरह से liquibase संदर्भ कॉन्फ़िगर किया गया संदर्भ के बिना) - हाँ यह इस तरह काम करता है।

तो उस नाम का चयन करें जो आपकी टीम पर कोई भी संदर्भ नाम के रूप में (हमारे मामले में कोई नहीं ') का उपयोग नहीं करेगा और फिर उस संदर्भ के साथ डिफ़ॉल्ट रूप से तरल पदार्थ चलाएं (उदाहरण पर एक नज़र डालें)। उस दृष्टिकोण के साथ आप किसी भी संदर्भ के बिना परिवर्तन-सेट चलाएंगे जो मुझे लगता है कि डिफ़ॉल्ट दृष्टिकोण होना चाहिए!

संबंधित मुद्दे