2012-04-05 16 views
7

मैं लिक्विबेस का मूल्यांकन कर रहा हूं और यह पता लगाने की कोशिश कर रहा हूं कि SQL स्क्रिप्ट का उपयोग करने पर डेटा माइग्रेशन के लिए इसका कोई लाभ है या नहीं। मान लीजिए मैं निम्नलिखित कर रहा हूँ:डेटाबेस माइग्रेशन के लिए Liquibase का उपयोग करने के लिए कोई लाभ?

मेरे संस्करण 0 डेटाबेस स्कीमा इस तरह दिखता है:

CREATE TABLE `Person` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `firstName` varchar(255) NOT NULL, 
    `lastName` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

डेटाबेस निम्नलिखित डालने के प्रतिनिधित्व वाले कुछ मौजूद डेटा के साथ से भर जाता है:

INSERT INTO `Person` (`id`, `firstName`, `lastName`) VALUES (1, 'foo', 'bar'); 

मैं फिर उस व्यक्ति तालिका में एक और कॉलम जोड़ने का निर्णय लें जो शून्य नहीं है लेकिन मैं कोई मौजूदा डेटा खोना नहीं चाहता हूं। संस्करण 0 से संस्करण 1 की माइग्रेशन स्क्रिप्ट इस तरह दिखेगी:

ALTER TABLE `Person` ADD COLUMN `dob` date DEFAULT NULL; 

UPDATE `Person` set `dob` = '1970-01-01'; 

ALTER TABLE `Person` MODIFY COLUMN `dob` NOT NULL; 

क्या लिक्विबेस इस उपयोग के मामले को आसान बना सकता है?

उत्तर

2

मैं हाल ही में एक ही चीज़ के माध्यम से चला गया। देखें: Adding a non-nullable column to existing table fails. Is the "value" attribute being ignored?

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

तो आपके प्रश्न का मेरा उत्तर है: हां, एसक्यूएल स्क्रिप्ट्स की श्रृंखला को बनाए रखने के लिए तरल पदार्थ का उपयोग करने के फायदे हैं। लेकिन यह उनमें से एक नहीं है। :)

+0

अपने प्रश्न/उत्तर, कि मदद करता है को जोड़ने के लिए धन्यवाद। –

+0

बेशक आप "एसक्यूएल" में डिफ़ॉल्ट के साथ एक शून्य कॉलम जोड़ सकते हैं। आप किस डीबीएमएस का जिक्र कर रहे हैं जो इसका समर्थन नहीं करता है? –

+0

@a_horse_with_no_name - क्षमा करें, स्पष्ट होने का मेरा मतलब है: कोई एकल SQL कमांड नहीं है जो एक शून्य-शून्य कॉलम बना सकता है जो मौजूदा पंक्तियों के लिए मान निर्दिष्ट करता है लेकिन जो डिफ़ॉल्ट कॉलम मान सेट नहीं कर रहा है। मुझे गलत साबित होने में प्रसन्नता हो रही है लेकिन मुझे लगता है कि इसे प्राप्त करने के लिए कमांड के सभी संयोजन कम से कम 3 लाइन लंबे हैं। – David

5

मुख्य बात यह है कि तरल पदार्थ आपको ट्रैक करने की क्षमता देता है कि कौन से परिवर्तन डेटाबेस पर लागू किए गए हैं।

आपके उदाहरण में, जो SQL आप सूचीबद्ध कर रहे हैं वह वही होगा जो तरल पदार्थ करेगा, लेकिन यह पता चल जाएगा कि आपका dev डेटाबेस संस्करण वाई पर है और जब आप अपने डेटाबेस को "अपडेट" करते हैं तो यह केवल एक जोड़े को लागू करेगा नए बदलाव जबकि उत्पादन संस्करण एक्स पर है और जब आप उत्पादन "अद्यतन" करते हैं तो यह अधिक परिवर्तन लागू करेगा।

नोट: एकाधिक डेवलपर्स और/या कोड शाखाओं का समर्थन करने के लिए एक संस्करण का उपयोग करने के बजाय तरल पदार्थ ट्रैक स्वतंत्र रूप से बदलते हैं।

लागू किए गए परिवर्तनों पर नज़र रखने का काम के अलावा, अन्य liquibase आप देना होगा लाभ में शामिल हैं: एकाधिक डाटाबेस प्रकार पर भी यही बदलाव विवरण के लिए

  • की क्षमता।
  • यदि लागू किया गया है तो तर्क/यदि तर्क है।
  • डेटाबेस इतिहास का जेनरेटेड दस्तावेज।
  • अधिक जटिल, बहु-कथन परिवर्तनों को आसानी से निर्दिष्ट करने की क्षमता।
+0

क्या आपका मतलब है "एकाधिक डेटाबेस प्रकारों पर एक ही परिवर्तन विवरण रखने की क्षमता"? इसका क्या मतलब है? आप एक ही विवरण क्यों चाहते हैं? –

+0

उदाहरण के लिए, यदि आपका एप्लिकेशन MySQL और Postgres दोनों का समर्थन करता है, तो आप एकल चेंजलॉग लिख सकते हैं जिसे डेटाबेस प्रकार –

+0

दोनों के खिलाफ निष्पादित किया जा सकता है आह हाँ, मुझे लगता है कि शब्द "विवरण" ने मुझे फेंक दिया। मैं एक सामान्य के बजाय परिवर्तन के अंग्रेजी विवरण के बारे में सोच रहा था। –

0

पतंग आपको मेरी राय में दोनों दुनिया का सर्वश्रेष्ठ प्रदान करता है। आप अपनी एसक्यूएल स्क्रिप्ट का उपयोग करना जारी रख सकते हैं और यह प्रबंधित करता है कि डेटाबेस पर कोई स्क्रिप्ट निष्पादित की गई है या नहीं और आपको अपने सामान्य रेल आधारित माइग्रेशन या लिक्विबेस की समान और नीचे क्षमता देता है।

मुझे बताएं कि आप क्या सोचते हैं।

https://github.com/soitgoes/mite

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