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
Post a Comment