संस्करण नियंत्रण प्रणालियाँ, और विशेष रूप से Git, कोड परिवर्तनों को ट्रैक करने, आपकी टीम के साथ सहयोग करने और आपके कोडबेस की स्थिरता सुनिश्चित करने के लिए आवश्यक उपकरण हैं। जबकि Git मुख्य रूप से स्रोत कोड के लिए डिज़ाइन किया गया है, आप इसे संस्करण नियंत्रण और स्कीमा परिवर्तन प्रबंधन के लिए MySQL डेटाबेस के संयोजन में भी उपयोग कर सकते हैं।
इस लेख में, हम गाइड प्रारूप में विशिष्ट उदाहरणों के साथ, Git हुक का उपयोग करके संस्करण नियंत्रण के लिए Git को MySQL के साथ एकीकृत करने का तरीका जानेंगे। लिस्टिंग में दी गई सभी स्क्रिप्ट पूरी तरह कार्यात्मक और पूर्ण हैं। आप उन्हें अपने परीक्षण वातावरण में क्रमिक रूप से पुन: पेश कर सकते हैं।
सबसे पहले, आइए एक परीक्षण डेटाबेस और उपयोगकर्ता बनाएं:
create database testdb_remote; create user 'user_remote'@'localhost' identified WITH mysql_native_password by 'remote123'; grant all on testdb_remote.* to 'user_remote'@'localhost';
इसके बाद, हम एक रिमोट रिपॉजिटरी बनाएंगे। यह किसी भी दूरस्थ सर्वर पर एक रिपॉजिटरी हो सकता है, लेकिन सरलता के लिए, हम इसे स्थानीय रूप से बनाएंगे। कमांड निष्पादित करने की सुविधा के लिए, मैं गिट बैश का उपयोग करता हूं। मेरी स्थानीय मशीन में पहले से ही एक git फ़ोल्डर है, इसलिए मैं इसका उपयोग करता हूं:
cd /c/git mkdir testdb.remote cd testdb.remote git init --bare
और रिमोट के क्लोन के रूप में एक स्थानीय रिपॉजिटरी बनाएं:
cd /c/git git clone /c/git/testdb.remote testdb.local cd testdb.local git ls-files
भंडार में कोई फ़ाइलें नहीं हैं; आइए एक बनाएं और अपने परिवर्तनों को रिमोट रेपो में डालें:
echo "Test DB repo" > readme.md git status git add . git commit -m "1st commit" git push
आइए दूरस्थ रिपॉजिटरी की सामग्री की जाँच करें:
cd /c/git/testdb.remote git ls-tree --full-tree -r HEAD
रिमोट रिपॉजिटरी में एक हुक फ़ोल्डर है, जिसमें उदाहरणों के साथ कई फ़ाइलें हैं:
ls -1 /c/git/testdb.remote/hooks
हुक ऐसी स्क्रिप्ट हैं जिन्हें विशिष्ट घटनाएँ घटित होने पर निष्पादित किया जाता है। Git में क्लाइंट-साइड और सर्वर-साइड हुक हैं। कमिटिंग और मर्जिंग जैसे ऑपरेशनों से क्लाइंट-साइड हुक ट्रिगर होते हैं। सर्वर-साइड हुक नेटवर्क संचालन पर चलते हैं जैसे कि पुश किए गए कमिट प्राप्त करना। हुक्स का यहां विस्तार से वर्णन किया गया है। तर्क को लागू करने के लिए विभिन्न विकल्प हैं; मैं पोस्ट-रिसीव सर्वर-साइड हुक का उपयोग करने का एक उदाहरण दूंगा।
हुक फ़ोल्डर में, हमें "पोस्ट-रिसीव" नामक एक फ़ाइल बनाने की आवश्यकता है, यह एक नियमित बैश स्क्रिप्ट है:
#!/bin/sh while read oval nval ref do echo List of files changed in the commit: git diff --name-only $oval $nval done
जब भी कोई पुश सफलतापूर्वक पूरा हो जाएगा तो उपरोक्त स्क्रिप्ट सर्वर पर निष्पादित की जाएगी और संशोधित फ़ाइलों की एक सूची आउटपुट करेगी। आइए readme.md में एक पंक्ति जोड़कर और दूरस्थ रिपॉजिटरी में परिवर्तनों को आगे बढ़ाकर यह कैसे काम करता है इसकी जाँच करें:
cd /c/git/testdb.local echo "New line" >> readme.md git add . git commit -m "Line added" git push
आप देख सकते हैं कि git पुश कमांड निष्पादित करते समय, आउटपुट में अब remote:
- यह पोस्ट-रिसीव स्क्रिप्ट का आउटपुट है जिसे सर्वर पर निष्पादित किया गया था।
बुनियादी बदलावों की बात करें तो फ़ाइलें जोड़ी जा सकती हैं, संशोधित की जा सकती हैं और हटाई जा सकती हैं। डेटाबेस में इन परिवर्तनों को लागू करने के तरीके के लिए आप विभिन्न दृष्टिकोण अपना सकते हैं:
मान लें कि आपने दूसरा विकल्प चुना है, इसलिए आपको जोड़ी गई या बदली गई फ़ाइलों को निष्पादित करने की आवश्यकता है। हम पैरामीटर --diff-filter=AM
जोड़कर ऐसी फ़ाइलों को यहां वर्णित अनुसार फ़िल्टर कर सकते हैं:
#!/bin/sh while read oval nval ref do echo List of files added or changed in the commit: git diff --name-only --diff-filter=AM $oval $nval done
कुछ फ़ाइलें जोड़ें, और readme.md को भी दोबारा बदलें:
echo "SELECT 1;" > test1.sql echo "SELECT 2;" > test2.sql echo "SELECT 3;" > test3.sql echo "New line 2" >> readme.md git add . git commit -m "New files" git push
हुक स्क्रिप्ट के आउटपुट में 4 फ़ाइलें हैं:
हम test1.sql और readme.md फ़ाइलों को संपादित करते हैं, test2.sql को हटाते हैं, और दूसरी फ़ाइल जोड़ते हैं:
echo "SELECT 11;" > test1.sql echo "New line 2" >> readme.md rm test2.sql echo "SELECT 4;" > test4.sql git add . git commit -m "Modify, remove and add" git push
केवल संशोधित और जोड़ी गई फ़ाइलें प्रदर्शित की जाती हैं:
हमारा लक्ष्य प्रत्येक सफल पुश के बाद SQL स्क्रिप्ट निष्पादित करना है, इसलिए हमें केवल इस प्रकार की फ़ाइलों को फ़िल्टर करने की आवश्यकता है; हमारे मामले में, हम यह आवश्यकता निर्धारित करेंगे कि उन सभी के पास ".sql" एक्सटेंशन होना चाहिए। फ़िल्टर करने के लिए, git diff
कमांड में पैरामीटर -- "*.sql"
जोड़ें:
#!/bin/sh while read oval nval ref do echo List of files added or changed in the commit: git diff --name-only --diff-filter=AM $oval $nval -- "*.sql" done
स्क्रिप्ट निष्पादित करने के लिए, हमें डेटाबेस से जुड़ने में भी सक्षम होना चाहिए। इसके लिए, हम क्रेडेंशियल बनाएंगे और कनेक्शन का परीक्षण करेंगे:
mysql_config_editor set --login-path=testdb_remote --host=localhost --port=3306 --user=user_remote --password mysql --login-path=testdb_remote --database=testdb_remote
".sql" फ़ाइलों के माध्यम से पुनरावृति करने के लिए हमारी स्क्रिप्ट को संशोधित करें, प्रत्येक फ़ाइल को निष्पादित करें और परिणाम की जाँच करें। हमें आवश्यक क्रम में फ़ाइलों को निष्पादित करने के लिए सूची आउटपुट को क्रमबद्ध करने की भी आवश्यकता है। गिट शो कमांड के साथ, हम SQL स्क्रिप्ट की सामग्री प्रदर्शित करते हैं और इसे MySQL द्वारा निष्पादन के लिए पाइप के माध्यम से पास करते हैं।
चर "$?" यदि SQL स्क्रिप्ट सफलतापूर्वक निष्पादित की गई थी तो इसमें 0 होगा और यदि कोई त्रुटि हुई तो दूसरा मान होगा:
#!/bin/sh while read oval nval ref do echo List of files added or changed in the commit: for file in $(git diff --name-only --diff-filter=AM $oval $nval -- "*.sql" | sort); do git show master:${file} | mysql --login-path=testdb_remote --database=testdb_remote echo "FILE: ${file} - result $?" done done
एक और परीक्षण करें - पहले से बनाई गई सभी ".sql" फ़ाइलें हटाएं और इसके लिए स्क्रिप्ट बनाएं:
फ़ाइलों के वांछित निष्पादन क्रम को सुनिश्चित करने के लिए हमें प्रत्येक फ़ाइल नाम में एक उपसर्ग (1_, 2_, आदि) जोड़ने की भी आवश्यकता है:
rm *.sql echo "DB Initialization" >> readme.md echo " DROP TABLE IF EXISTS customers; CREATE TABLE customers ( id int UNSIGNED NOT NULL AUTO_INCREMENT, name varchar(255) DEFAULT NULL, PRIMARY KEY (id) ); " > 1_customers.sql echo " INSERT INTO customers (id, name) VALUES (1, 'John Doe'), (2, 'Jane Smith') AS new ON DUPLICATE KEY UPDATE customers.name = new.name; " > 2_customers_init.sql echo " DROP PROCEDURE IF EXISTS get_customer; DELIMITER $$ CREATE PROCEDURE get_customer(IN customer_id int UNSIGNED) BEGIN SELECT c.id, c.name FROM customers c WHERE c.id = customer_id; END $$ " > 3_get_customer.sql echo "SELECT FROM customers;" > 4_error_select.sql ls -1
तो हमारे पास चार ".sql" फ़ाइलें हैं जिन्हें निष्पादित करने की आवश्यकता है:
हम भंडार में परिवर्तन करते हैं:
और हम देखते हैं कि जब git push
किया जाता है, तो फ़ाइलें क्रमिक रूप से निष्पादित होती हैं, और प्रत्येक फ़ाइल का निष्पादन परिणाम (MySQL कमांड एग्जिट कोड) प्रदर्शित होता है। फ़ाइल "4_error_select.sql" में एक सिंटैक्स त्रुटि है, इसलिए इसके निष्पादन का परिणाम 1 है।
और अंत में, आइए देखें कि हमारे पास डेटाबेस में क्या है:
mysql --login-path=testdb_remote --database=testdb_remote show tables; call get_customer(1); call get_customer(2);
जैसा कि आप देख सकते हैं, तालिका और प्रक्रिया दूरस्थ डेटाबेस में बनाई गई थी। प्रक्रिया सफलतापूर्वक निष्पादित होती है और डेटा लौटाती है।
हुक स्क्रिप्ट आउटपुट की पठनीयता में सुधार करने के लिए, आप MySQL CLI आउटपुट को दबा सकते हैं या इसे लॉग फ़ाइल पर रीडायरेक्ट कर सकते हैं। आप MySQL कमांड निष्पादन के परिणाम का विश्लेषण भी कर सकते हैं और हुक स्क्रिप्ट में अधिक तर्क जोड़ सकते हैं।
उदाहरण के लिए, आप एक परीक्षण डेटाबेस पर SQL स्क्रिप्ट निष्पादित कर सकते हैं और फिर उस पर कुछ परीक्षण चला सकते हैं (जैसा कि मैंने यहां बताया है)। यदि परीक्षण डेटाबेस पर परीक्षण सफलतापूर्वक पूरे हो गए हैं, तो उत्पादन डेटाबेस पर SQL स्क्रिप्ट चलाएँ और संभवतः उस पर कुछ परीक्षण भी चलाएँ।
प्रत्येक चरण के परिणामों का विश्लेषण करके, आप किसी भी कॉन्फ़िगरेशन की पाइपलाइन बना सकते हैं।
बेशक, प्रत्येक दृष्टिकोण के कई फायदे और सीमाएँ हैं। दूसरे दृष्टिकोण के साथ, उस क्रम को सुनिश्चित करना आवश्यक है जिसमें स्क्रिप्ट निष्पादित की जाती हैं क्योंकि उदाहरण के लिए, हम किसी तालिका में डेटा तब तक सम्मिलित नहीं कर सकते जब तक कि वह न बन जाए। यह सुनिश्चित करना भी आवश्यक है कि आप स्क्रिप्ट को फिर से निष्पादित कर सकते हैं, यानी, उन स्थितियों को सही ढंग से संभाल सकते हैं जब बनाई जा रही वस्तु पहले से ही डेटाबेस में है, या डेटाबेस में पहले से ही जोड़ा जाने वाला डेटा मौजूद है।
संस्करण प्रणाली का उपयोग करते समय, विकास प्रक्रिया थोड़ी अधिक जटिल हो जाती है क्योंकि पूर्व निर्धारित प्रारूप की स्क्रिप्ट में परिवर्तनों को अतिरिक्त रूप से औपचारिक बनाना आवश्यक होता है। हालाँकि, आप इंस्टॉलेशन फ़ाइल का उपयोग करके कुछ लचीलापन प्राप्त कर सकते हैं।
वर्णित तकनीक का मुख्य लाभ बहुत कम प्रयास के साथ डेटाबेस में वर्जनिंग का कार्यान्वयन है, साथ ही सीआई/सीडी पाइपलाइनों को लागू करने की क्षमता भी है।
यह मूल्यांकन करने के लिए कि क्या यह आपके लिए उपयोगी हो सकता है, आप खुद से यह पूछकर शुरुआत कर सकते हैं: आप कितनी बार उत्पादन में सीधे कोड लिखते हैं?