liquibase in Spring Boot


Liquibase

Liquibase dùng để quản lý thay đổi trong cơ sở dữ liệu cho dự án. Về vai trò thì gần giống như Script SQL dùng để khởi tạo, chèn, cập nhật cơ sở dữ liệu
Vấn đề là đoạn script chỉ phù hợp với 1 csdl
File change-log liquibase thì 1 file change-log  phù hợp với các hệ cơ sở dữ liệu khác nhau như MySQL , Oracle, PostgreSQL
Ví dụ:
Script SQL : insert (a,b,c) into (name, age,address)
Liquibase:  chèn (a,b,c) (name,age,address)
Khi đọc file Liquibase thì sẽ convert ra câu lệnh tương ứng với csdl tương ứng, lên việc viết một đoạn xml bằng liquibase sẽ được dịch ra tương ứng với các csdl dùng trong ứng dụng




-----------------------SET-UP for dependency----------------------------

Cần tối thiểu ---- Dependency liquibase
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
---- dependency Liên quan đến kết nối CSDL: Ví dụ cho MySQL, hoặc Oracle, hoặc Postgre ….. tương ứng

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

-----  dependency JPA, Hibernate
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>


--------------------- SET-UP file properties ------------------------------





File change-log được đặt tại thư mục resources/db/liquibase-changelog.xml
Chú ý định dạng file có thể là yaml, hoặc …
(Nếu không dùng file changelog-liquibase, như đã nói trước, chúng ta có thể dùng file script schema.sql hoặc data.sql và đặt vào thư mục resources là tự động được Spring boot load khi khởi chạy ứng dụng)

Trong hướng dẫn này tôi dùng file liquibase.xml

#db ##đường dẫn file change-log liquibase.xml


spring.liquibase.change-log=classpath:db/liquibase-changelog.xml 



#mysql Liên quan đến cơ sở dữ liệu tương ứng

spring.jpa.hibernate.ddl-auto=none ß---------chú ý dùng none vì sẽ để liquibase khởi tạo và chạy lệnh trên cơ sở dữ liệu

spring.datasource.url=jdbc:mysql://localhost:3306/liquibase  url csdl

spring.datasource.username=root <--- user truy cập của csdl

spring.datasource.password=123@123a ß- pass truy cập tài khoản user trên





file liquibase-changelog.xml được đặt tại thư mục db, cùng cấp với thư mục changelog




Trong file liquibasechangelog.xml được thiết kế bao gồm các file changlog khác bằng chỉ thị include chỉ ra đường dẫn file changelog cho bảng khác

Nội dung file liquibase-changelog FOR Book Table.xml




Nội dung file change-log.xml
Được chia làm các <changeSet> khác nhau bao gồm id và tên người viết changeSet đó
Ví dụ:

<?xml version="1.0" encoding="utf-8"?>


<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"

       xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd

                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">





       <changeSet id="20180522091152-1" author="bonh">

              <createTable tableName="book">

                     <column name="id" type="bigint" autoIncrement="${autoIncrement}">

                           <constraints primaryKey="true" nullable="false" />

                     </column>

                     <column name="name" type="varchar(255)">

                           <constraints nullable="true" />

                     </column>



                     <column name="author" type="varchar(255)">

                           <constraints nullable="true" />

                     </column>



                     <column name="price" type="decimal(10,2)">

                           <constraints nullable="true" />

                     </column>



                     <column name="version" type="bigint">

                           <constraints nullable="true" />

                     </column>



              </createTable>



       </changeSet>



       <changeSet id="2" author="bonh">

              <addColumn tableName="book">

                     <column name="date" type="datetime">

                           <constraints nullable="true" />

                     </column>

              </addColumn>

       </changeSet>





       <changeSet author="bonh" id="3">

              <dropColumn columnName="date" tableName="book" />

       </changeSet>



       <changeSet author="bonh" id="4">

              <addAutoIncrement columnName="id" incrementBy="1"

                     startWith="0" columnDataType="bigint" schemaName="liquibase"

                     tableName="book" />

       </changeSet>

       <changeSet author="bonh" id="5">

              <insert tableName="book">

                     <column name="name" value="How to program Java" />

                     <column name="author" value="Nguyen Huy Bo" />

                     <column name="price" value="100.0" />

                     <column name="version" value="0" />

              </insert>

       </changeSet>

       <changeSet author="bonh" id="6">

              <insert tableName="book">

                     <column name="name" value="How to program C" />

                     <column name="author" value="Nguyen  Bo" />

                     <column name="price" value="130.0" />

                     <column name="version" value="0" />

              </insert>

              <insert tableName="book">

                     <column name="name" value="How to program C#" />

                     <column name="author" value="Nguyen Huy Bo" />

                     <column name="price" value="1.0" />

                     <column name="version" value="2" />

              </insert>

              <insert tableName="book">

                     <column name="name" value="How to program PHP" />

                     <column name="author" value="Nguyen Huy Bo" />

                     <column name="price" value="100.0" />

                     <column name="version" value="0" />

              </insert>

              <insert tableName="book">

                     <column name="name" value="How to program Ruby" />

                     <column name="author" value="Nguyen Huy Bo" />

                     <column name="price" value="100.0" />

                     <column name="version" value="0" />

              </insert>

       </changeSet>

</databaseChangeLog>


Ví dụ trên là 1 file change-log cho 1 bảng TBL Book

Chúng ta có thể tạo thêm các file change-log cho các bảng khác rồi dùng chỉ thị include trong file liquibase-changelog.xml  để có tác dụng
Cách tổ chức file như sau:
1.       Chúng ta lên tạo ra mỗi file changelog cho mỗi bảng khác nhau
2.       Include file change log đó vào trong file liquibase-changelog.xml
Hết



Mọi chi tiết liên quan đến viết file change-log tham khảo tại

Tips: Cơ chế thực hiện file change-log như sau
Các file change-log bao gồm các đoạn changeSet có id và người thực hiện
Khi đọc file change-log để thực thi với csdl
Các changeSet ID và author sẽ được chèn vào co sở dư liệu ở bảng database-changelog
Và nội dung mỗi ChangeSet sẽ được băm ra và chèn vào trong csdl tương ứng với changeSetID đó




Nếu bạn sửa đoạn changeSet tương ứng với ID và chạy lại ứng dụng thì sẽ báo lỗi vì lúc này đoạn checksum kiểm tra changeSet đó và đoạn checksum trong csdl không khớp. Nên báo lỗi
Nếu chúng ta muốn thay đổi thì nên tạo ra 1 changeSet khác và có id khác, lúc đó nó sẽ được tạo mới một thay đổi trên base là các changeset trước đó.
Với cơ chế kiểm tra như trên:
Thì việc xóa 1 changeSet trong file cũng không bị lỗi, Lỗi chỉ xảy ra khi chúng ta sửa đoạn changeSet đã thực thi rồi,
Hoặc có một cách khác là chúng ta xóa các bản ghi trong bảng databasechangelog thì k bị lỗi checksum
Hoặc xóa toàn bộ các bảng trong DB


Comments

Popular posts from this blog

Fixing the DeepSpeed Import Error While Fine-Tuning the Qwen Model

Amazon Linux 2023 - User data configuration for launch templates to connect to the EKS cluster

How to create ISM policy and rotate logs in opensearch