स्प्रिंग बूट एप्लिकेशन में डेटाबेस संरचना का प्रबंधन करने के लिए लिक्विबेस का उपयोग करना। भाग 1

इस लेख में, मैं रिलेशनल डेटाबेस संरचना को बनाने और इस संरचना को एक संस्करण से दूसरे संस्करण में स्थानांतरित करने के लिए स्प्रिंग बूट एप्लिकेशन में लिक्विबेस उपयोगिता के उपयोग पर चर्चा करूंगा । पहले भाग में, हम मूल उदाहरण का विश्लेषण करेंगे, और दूसरे में हम वापस परिवर्तनों को रोल करने के लिए लिबास-मावे-प्लगइन का उपयोग करने के बारे में बात करेंगे और डेटाबेस संरचनाओं की तुलना करके स्वचालित रूप से स्क्रिप्ट तैयार करेंगे।

चलो स्प्रिंग बूट + जेपीए (हाइबरनेट) पर सबसे सरल एप्लिकेशन बनाकर शुरू करें। स्प्रिंग प्रिसिफ़र इसमें हमारी मदद करेगा। निर्भरता से, JPA, MySQL और वेब का चयन करें। इस चरण में लिकिबेस को भी जोड़ा जा सकता है, लेकिन बेहतर समझ के लिए हम इसे बाद में मैन्युअल रूप से करेंगे।

आवेदन का आधार बनाएं


हम अपने आवेदन में एक इकाई वर्ग जोड़ते हैं, साथ ही साथ एक रिपॉजिटरी और एक आरईएसटी नियंत्रक इसके साथ काम करते हैं। संक्षिप्तता के लिए, हम बनाए गए निकाय में उपयोगकर्ताओं के बारे में जानकारी संग्रहीत करेंगे।

@Entity @Table(name = "users") public class User implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "username", unique = true, nullable = false) private String userName; @Column(name = "password", nullable = false) private String password; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; @Column(name = "email") private String email; //    ,    //    Lombok } 

स्प्रिंग डेटा रिपॉजिटरी कोड को बेहद संक्षिप्त बनाता है

 public interface UserRepository extends JpaRepository<User, Long> { } 

REST नियंत्रक जो उपयोगकर्ता तालिका की संपूर्ण सामग्री प्रदर्शित करेगा

 @RestController public class UserController { private UserRepository userRepository; @Autowired public UserController(UserRepository userRepository) { this.userRepository = userRepository; } @GetMapping("/user/all") public List<User> allUsers() { return userRepository.findAll(); } } 

Application.properties फ़ाइल में सेटिंग्स

 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/geek_db?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=dbuser spring.datasource.password=dbpassword spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 

यह माना जाता है कि आपका कंप्यूटर एक मानक बंदरगाह पर एक MySQL सर्वर चला रहा है। यदि आवश्यक हो, तो कनेक्शन URL में सर्वर URL, साथ ही उपयोगकर्ता नाम और पासवर्ड समायोजित करें। यह createDatabaseIfNotExist पैरामीटर पर भी ध्यान देने योग्य है। इसके लिए धन्यवाद, जब कनेक्ट होता है, तो हम सर्वर पर नहीं होने पर geek_db नामक एक डेटाबेस बनाएंगे

लिक्विबेस जोड़ें


निश्चित रूप से आपने देखा कि हाइबरनेट के लिए एक सेटिंग गायब है , जिसका नाम है स्प्रिंग .jpa.hibernate.ddl-auto । अधिकांश शुरुआती मैनुअल में, इसके लिए अद्यतन मूल्य का संकेत दिया जाता है, जिसके कारण हाइबरनेट परियोजना में मौजूद इकाई वर्गों के आधार पर, सर्वर पर तालिका संरचना को बनाएगा और समायोजित करेगा। यदि डेटा योजना बहुत सरल है या परियोजना प्रशिक्षण है, तो यह दृष्टिकोण अच्छी तरह से इस्तेमाल किया जा सकता है, लेकिन कुछ हद तक जटिल योजना के साथ, समस्याओं की सबसे अधिक संभावना होगी, यदि केवल इसलिए कि हम हाइबरनेट डीडीएल स्क्रिप्ट बनाने की प्रक्रिया को नियंत्रित नहीं कर सकते। एक और समस्या यह है कि इस दृष्टिकोण के साथ डेटाबेस संरचना में हाइबरनेट में किए गए परिवर्तनों को वापस करने का कोई आसान तरीका नहीं है।

यह उपरोक्त समस्याओं को हल करना है कि हम लिक्विबेस उपयोगिता का उपयोग करेंगे। सौभाग्य से हमारे लिए, वह पूरी तरह से स्प्रिंग बूट अनुप्रयोगों के साथ एकीकृत करने में सक्षम है! इसका उपयोग शुरू करने के लिए, आपको निम्न चरणों का पालन करना होगा

सेटिंग को application.properties फ़ाइल में जोड़ें

 spring.jpa.hibernate.ddl-auto=none 

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

Pom.xml में एक निर्भरता जोड़ें

 <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency> 

इसे जोड़ने के बाद, स्प्रिंग बूट स्वचालित रूप से एक विशेष बीन बनाएगा, जिसका नाम लिबिबेस है, जो हर बार एप्लिकेशन शुरू होने पर लिक्विबेस स्क्रिप्ट के आधार पर डेटाबेस स्कीमा को कॉन्फ़िगर करने के लिए सभी क्रियाओं को करेगा।

अब आपको लिक्विबेस स्क्रिप्ट को स्वयं जोड़ना होगा, जिससे हमें वह तालिका बनानी होगी जो हमें चाहिए। / Src / main / Resources / db / changelog फ़ोल्डर में, db.changelog-master.yaml नामक एक फाइल बनाएं और उसमें निम्नलिखित सामग्री जोड़ें

 databaseChangeLog: - logicalFilePath: db/changelog/db.changelog-lesson1.yaml - changeSet: id: 1 author: your_liquibase_username changes: - createTable: tableName: users columns: - column: name: id type: BIGINT autoIncrement: true constraints: primaryKey: true nullable: false - column: name: username type: varchar(50) constraints: unique: true nullable: false - column: name: password type: varchar(512) constraints: nullable: false - column: name: first_name type: varchar(50) - column: name: last_name type: varchar(50) - column: name: email type: varchar(50) 

आइए इस स्क्रिप्ट की सामग्री का विश्लेषण करें। सबसे पहले, इसमें एक changeSet है। ChangeSet Git या SVN जैसे वर्जन कंट्रोल सिस्टम में एक कमिट का एक एनालॉग है। एक प्रतिबद्धता के साथ सादृश्य द्वारा, एक परिवर्तन के हिस्से के रूप में किए गए परिवर्तनों को डेटाबेस सर्वर में वापस रोल या रोल किया जा सकता है। प्रत्येक चेंजसेट के पास एक विशिष्ट पहचानकर्ता होना चाहिए, जिसके साथ लिक्विबेस यह निर्धारित करता है कि किसी दिए गए चेंजसेट को इस डेटाबेस में पंप किया गया है या नहीं।

चेंजसेट में टेबल बनाने के लिए एक कमांड होती है, और टेबल की संरचना का वर्णन लिकिबेस द्वारा किया जाता है, न कि एसक्यूएल स्क्रिप्ट के द्वारा। इसके लिए धन्यवाद, यह फ़ाइल क्रॉस-प्लेटफ़ॉर्म बन जाती है। Liquibase उपयोग किए गए डेटाबेस सर्वर के आधार पर एक SQL स्क्रिप्ट उत्पन्न करेगा। इसके अलावा, अगर हमें दिए गए चेंज को वापस रोल करने की आवश्यकता है, तो Liquibase स्वचालित रूप से दी गई तालिका को हटाने के लिए एक स्क्रिप्ट बनाने में सक्षम होगा। यदि हमने SQL स्क्रिप्ट का उपयोग किया है, तो हमें परिवर्तनों को वापस लेने के लिए मैन्युअल रूप से एक स्क्रिप्ट लिखना होगा। पिछलग्गू खंड में, हमारे पास केवल एक टीम है और यह अच्छा अभ्यास माना जाता है, इस तथ्य के बावजूद कि एक बदलाव में किसी भी टीम की संख्या हो सकती है।

लिखित कोड प्रोग्राम को चलाने के लिए पर्याप्त है, लेकिन अधिक स्पष्ट रूप से इसके काम के परिणाम देखने के लिए, आइए एक और चेंजसेट जोड़ें, जो तालिका को डेटा से भर देगा।

  - changeSet: id: 2 author: your_liquibase_username comment: "Create admin user" changes: - insert: tableName: users columns: - column: name: username value: "admin" - column: name: password value: "admin" - column: name: email value: "admin@server.com" - insert: tableName: users columns: - column: name: username value: "guest" - column: name: password value: "guest" - column: name: email value: "guest@server.com" rollback: - delete: tableName: users where: username in ('admin', 'guest') 

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

और इसलिए, आइए हमारे एप्लिकेशन को चलाएं और लिंक का पालन करने का प्रयास करें http: // localhost: 8080 / user / all । यदि आवेदन शुरू हो गया है, तो आप तालिका में जोड़े गए दो उपयोगकर्ताओं के बारे में जानकारी के साथ एक JSON प्रतिक्रिया देखेंगे। यह एप्लिकेशन लॉन्च लॉग पर एक नज़र डालने के लायक भी है, जिसमें आप लिपिबेस को देख सकते हैं, जो डेटाबेस को आरंभीकृत करने के लिए निष्पादित करता है। DATABASECHANGELOG तालिका पर विशेष ध्यान दिया जाना चाहिए। इसमें यह है कि लिक्विबेस डेटाबेस में किए गए परिवर्तनों के लॉग को संग्रहीत करता है।

अभी के लिए बस इतना ही। कुछ समय बाद, मैं डेटाबेस संरचनाओं की तुलना करके और किए गए परिवर्तनों को वापस लाकर लिबास-मावेन-प्लगइन के उपयोग के बारे में एक निरंतरता प्रकाशित करने की योजना बना रहा हूं।

मैं किसी भी अतिरिक्त और टिप्पणियों के लिए आभारी रहूंगा!

इस लेख पर आधारित PS पूर्ण कोड github.com/usharik/spring-liquibase-demo/tem/part-1

Hbr.com/en/post/460907 पर जारी है

Source: https://habr.com/ru/post/hi460377/


All Articles