লিকুইবেস দিয়ে ডেভেলপমেন্ট মোডে ইনিশিয়াল ডাটা লোড করা: স্প্রিং হাইবারনেট - ১

এপ্লিকেশনে পরিবর্তন, পরিবর্ধন করতে যদি সমস্যা হয়, তাহলে হয় এপ্লিকেশন বানানো বাদ দিয়ে মুরগি পালা উচিত অথবা যেভাবে কাজ করছেন, সেটা পরিবর্তন করা উচিত। এই সব পরিবর্তনের একটা হলো ডাটাবেসে স্কিমা কিভাবে পরিবর্তন করা যায়। কখনো কি এমন কথা শুনেছেন যে, "না, এই ফিচার করা যাবে না, ডাটাবেসে অনেক পরিবর্তন করতে হবে"? আবার কোড পরিবর্তন করেছেন কিন্তু ডাটাবেসে স্কিমা পরিবর্তন করতে গিয়ে ঝামেলায় পড়েছেন? একটা কোড যখন প্রোডাকশনে যায়, তারপর সময়ে সময়ে অনেক পরিবর্তন করতে হয় স্পেশালি কোড এবং ডাটাবেসে। কোডের পরিবর্তন তুলনামূলক সহজ। টেস্ট কেস লেখা থাকলে রিস্ক থাকে না। অন্যদিকে ডাটাবেসের পরিবর্তন একটু ট্রিকি। হাতে ধরে কনসোলে ঢুকে পরিবর্তন করতে গেলে, উল্টা-পাল্টা কিছু হলে প্রোডাকশন এপ্লিকেশন বন্ধ হয়ে যায়।


জাভা, স্প্রিং এবং হাইবারনেট নিয়ে যারা কাজ করেন, তাদের জন্য বেশ কিছু সমাধান আছে এই কাজ করার জন্য। Flyway এবং Liquibase এদের মধ্যে অন্যতম। আমি বিগত ৪ বছর ধরে Liquibase ব্যবহার করে আসছি এবং এখনো ভালোবাসি। আমি Flyway ও ট্রাই করেছি কিন্তু এডভান্স ফিচার এর জন্য আমি Liquibase পছন্দ করি। সো, লিকুইবেস দিয়ে কি করতে পারি

১. প্রোডাকশনে বুটস্ট্রাপ ডাটা লোড করা

২. প্রোডাকশনে স্কিমা পরিবর্তন করা, এড/এডিট/ডিলিট করা

৩. পরিবর্তিত ডাটাবেসের সাথে পূর্বের ডাটাবেসের তুলনা করে ডেল্টা sql বের করা

৪. ডেভেলপমেন্ট মোডে এপ্লিকেশন চালানোর জন্য বুটস্ট্রাপ ডাটা লোড করা

৫. খুব সহজেই ভিন্ন ভিন্ন প্রোফাইলের সাথে কাজ করা যায়৬. ডাটাবেস থেকে ইনিশিয়াল স্কিমা জেনারেট করা


আমি আসলে অনেক sql স্কিমা পরিবর্তন করি কিন্তু নিজে এক অক্ষরও sql লেখি না। সব কিছু লিকুইবেস করে দেয়।চলুন দেখা যাক কিভাবে।


ডেভ প্রোফাইলে ইনিশিয়াল ডাটা যুক্ত করা


১. ম্যাভেন ফাইলে দুটা প্রোফাইল তৈরী করে ফেললাম এবং কনফিগারেশন ফাইল কোথায় বলে দিলাম। একটা ডেভ ও আরেকটা স্টেজিং এর জন্য



<build>
   <plugins>
      <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
         <configuration>
            <fork>true</fork>
            <executable>true</executable>
            <profiles>
               <profile>dev</profile>
            </profiles>
         </configuration>
      </plugin>
   </plugins>
</build>

<profiles>
   <profile>
      <id>dev</id>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
      <build>
         <plugins>
            <plugin>
               <groupId>org.liquibase</groupId>
               <artifactId>liquibase-maven-plugin</artifactId>
               <version>3.5.3</version>
               <configuration>
                  <propertyFile>src/main/resources/liquibase/config/liquibase-dev.properties</propertyFile>
               </configuration>
            </plugin>
         </plugins>
      </build>
   </profile>

   <profile>
      <id>stage</id>
      <build>
         <plugins>
            <plugin>
               <groupId>org.liquibase</groupId>
               <artifactId>liquibase-maven-plugin</artifactId>
               <version>3.5.3</version>
               <configuration>
                  <propertyFile>src/main/resources/liquibase/config/liquibase-stage.properties</propertyFile>
               </configuration>
            </plugin>
         </plugins>
      </build>
   </profile>
</profiles>

pom.xml


লিকুইবেসের জন্য ডেভ কনফিগারেশন ফাইল

# base database
username=root
password=সিক্রেট
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/blog_dev?createDatabaseIfNotExist=true&useEncoding=true&characterEncoding=UTF-8&characterSetResults=UTF-8

# liquibase:update
changeLogFile=src/main/resources/liquibase/changelog/changelog-dev.xml

# mvn liquibase:generateChangeLog
outputChangeLogFile=src/main/resources/liquibase/generated/liquibase-changeLog.mysql.sql

liquibase-dev.properties


<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">
    <include file="dev/changelog-dev.sql"         relativeToChangelogFile="true"/>
</databaseChangeLog>

changelog-dev.xml


ডেভ প্রোফাইলের ইনিশিয়ালডাটা

--liquibase formatted sql

--changeset MHASSAN:initian-test-data-1
INSERT INTO `ROLE` (`id`,`name`) VALUES
('ff80818166430f740166431734140005', 'ROLE_ADMIN');

INSERT INTO `USER` (`id`,`email`,`ENABLED`,`firstName`,`lastName`,`lastPasswordResetDate`,`password`) VALUES
('ff80818166430f74016643194ceb0012' ,'you@gmail.com',NULL,'admin',NULL,NULL,'$2a$10$XU3aAf0d8kMKO4M5vpvWeqdAkuzmxwswVuJHaC');

INSERT INTO `USER_ROLE` (`USER_ID`,`ROLE_ID`) VALUES
('ff80818166430f74016643194ceb0012', 'ff80818166430f740166431734140005');

changelog-dev.sq


ডেভ প্রোফাইলের hibernate.ddl সেটিং এবং লিকুইবেস ডিফল্ট সেটিং

spring.jpa.hibernate.ddl-auto=update

# ===============================
# = LIQUIBASE
# ===============================
spring.liquibase.enabled=false

application-dev.properties


তারমানে হচ্ছে ডেভেলপমেন্ট মোডে আমার এনটিটি ক্লাস থেকে হাইবারনেট আমার জন্য sql টেবিল তৈরী করে থাকে। যদি আমি ইনিশিয়াল ডাটা ডাটাবেস এ যুক্ত করতে চাই তাহলে নিচের দুটা কমান্ড দিলেই হবে


spring-boot এপ্লিকেশন নরমালি ডেভ প্রোফাইলে চলে

mvn spring-boot:run  



নিচের কমান্ড দিয়ে ইনিশিয়াল ডাটা ডাটাবেসে যুক্ত করে দেবো, এই কমান্ডের ফলে changelog-dev.sql এর সকল ডাটা ডেভ ডাটাবেসে ইনসার্ট হয়ে যাবে।

mvn liquibase:update



পার্ট - ১ এখানেই শেষ। পার্ট -২ তে দেখব কিভাবে ডেভ ডাটাবেস থেকে প্রোডাকশনের জন্য ইনিশিয়াল স্কিমা তৈরী করতে পারি।