Gunakan Liquibase untuk Mengembangkan Skema Database Anda dengan Aman

1. Ikhtisar

Dalam tutorial singkat ini, kita akan menggunakan Liquibase untuk mengembangkan skema database aplikasi web Java.

Kami akan fokus pada aplikasi Java umum terlebih dahulu, dan kami juga akan melihat fokus pada beberapa opsi menarik yang tersedia untuk Spring dan Hibernate.

Sangat singkat, inti dari menggunakan Liquibase adalah yang changelog berkas - berkas XML yang melacak semua perubahan yang perlu dijalankan untuk memperbarui DB.

Mari kita mulai dengan ketergantungan Maven yang perlu kita tambahkan ke pom.xml kita :

 org.liquibase liquibase-core 3.4.1 

Anda juga dapat memeriksa apakah ada versi liquibase-core yang lebih baru di sini.

2. Log Perubahan Basis Data

Sekarang, mari kita lihat file changeLog sederhana - file ini hanya menambahkan kolom " address " ke tabel " users ":

Perhatikan bagaimana set perubahan diidentifikasi oleh id dan penulis - untuk memastikannya dapat diidentifikasi secara unik dan hanya diterapkan sekali.

Mari kita tidak melihat bagaimana cara memasukkan ini ke dalam aplikasi kita dan memastikannya berjalan saat aplikasi dijalankan.

3. Jalankan Liquibase Dengan Spring Bean

Opsi pertama kami untuk menjalankan perubahan pada startup aplikasi adalah melalui Spring bean. Tentu saja ada banyak cara lain, tetapi jika kita berurusan dengan aplikasi Spring - ini adalah cara yang bagus dan sederhana untuk melakukannya:

@Bean public SpringLiquibase liquibase() { SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setChangeLog("classpath:liquibase-changeLog.xml"); liquibase.setDataSource(dataSource()); return liquibase; }

Perhatikan bagaimana kami mengarahkannya ke file changeLog valid yang perlu ada di classpath.

4. Gunakan Liquibase Dengan Spring Boot

Jika Anda menggunakan Spring Boot, Anda tidak perlu menentukan Bean untuk Liquibase.

Yang Anda butuhkan hanyalah meletakkan log perubahan Anda di " db / changelog / db.changelog-master.yaml " dan migrasi Liquibase akan berjalan secara otomatis saat startup.

Perhatikan bahwa:

  • Anda perlu menambahkan ketergantungan " liquibase-core ".
  • Anda dapat mengubah file log perubahan default menggunakan properti " liquibase.change-log " - misalnya:
liquibase.change-log=classpath:liquibase-changeLog.xml

5. Nonaktifkan Liquibase di Spring Boot

Terkadang, kami mungkin perlu menonaktifkan eksekusi migrasi Liquibase saat memulai.

Opsi paling sederhana yang kita miliki adalah menggunakan properti spring.liquibase.enabled . Dengan cara ini, semua konfigurasi Liquibase yang tersisa tetap tidak tersentuh.

Berikut contoh Spring Boot 2:

spring.liquibase.enabled=false

Untuk Spring Boot 1.x, kita perlu menggunakan properti liquibase.enabled :

liquibase.enabled=false

6. Hasilkan changeLog Dengan Plugin Maven

Alih-alih menulis file changeLog secara manual - kita dapat menggunakan plugin Liquibase Maven untuk membuatnya dan menghemat banyak pekerjaan.

6.1. Konfigurasi Plugin

Berikut adalah perubahan pada pom.xml kami :

 org.liquibase liquibase-maven-plugin 3.4.1  ...   org.liquibase liquibase-maven-plugin 3.4.1  src/main/resources/liquibase.properties   

6.2. Menghasilkan ChangeLog Dari Database yang Ada

Kita dapat menggunakan plugin untuk Menghasilkan Changelog dari Database yang Ada:

mvn liquibase:generateChangeLog

Berikut adalah sifat-sifat liquibase :

url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver outputChangeLogFile=src/main/resources/liquibase-outputChangeLog.xml

Hasil akhirnya adalah file changeLog yang dapat kita gunakan baik untuk membuat skema DB awal atau untuk mengisi data. Begini tampilannya untuk aplikasi contoh kita:

                     ... 

6.3. Hasilkan ChangeLog Dari Diff Antara Dua Database

Kita dapat menggunakan plugin untuk menghasilkan file changeLog dari perbedaan antara dua database yang ada (misalnya: pengembangan dan produksi):

mvn liquibase:diff

Berikut ini propertinya:

changeLogFile=src/main/resources/liquibase-changeLog.xml url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver referenceUrl=jdbc:h2:mem:oauth_reddit diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml referenceDriver=org.h2.Driver referenceUsername=sa referencePassword=

Dan inilah potongan dari changeLog yang dihasilkan :

Ini adalah cara yang sangat ampuh untuk mengembangkan DB Anda dengan - misalnya - mengizinkan Hibernate untuk menghasilkan skema baru secara otomatis untuk pengembangan, dan kemudian menggunakannya sebagai titik referensi untuk melawan skema lama.

7. Gunakan Plugin Hibernate Liquibase

Jika aplikasi menggunakan Hibernate - kita akan melihat cara yang sangat berguna untuk menghasilkan changeLog .

Pertama - inilah cara plugin liquibase-hibernate dikonfigurasi di Maven:

7.1. Konfigurasi Plugin

Pertama, mari kita konfigurasikan plugin baru dan menggunakan dependensi yang benar:

  org.liquibase liquibase-maven-plugin 3.4.1  src/main/resources/liquibase.properties    org.liquibase.ext liquibase-hibernate4 3.5   org.springframework spring-beans 4.1.7.RELEASE   org.springframework.data spring-data-jpa 1.7.3.RELEASE    

7.2. Menghasilkan changeLog dari Diffs Between a Database dan Persistence Entities

Sekarang, untuk bagian yang menyenangkan. Kita dapat menggunakan plugin ini untuk menghasilkan file changeLog dari perbedaan antara database yang ada (misalnya produksi) dan entitas persistensi baru kita.

Jadi - untuk mempermudah - setelah entitas dimodifikasi, Anda dapat dengan mudah menghasilkan perubahan terhadap skema DB lama, mendapatkan cara yang bersih dan kuat untuk mengembangkan skema Anda dalam produksi .

Berikut adalah properti liquibase:

changeLogFile=classpath:liquibase-changeLog.xml url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver referenceUrl=hibernate:spring:org.baeldung.persistence.model ?dialect=org.hibernate.dialect.MySQLDialect diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml

Catatan: referenceUrl menggunakan pemindaian paket, jadi parameter dialek diperlukan.

8. Kesimpulan

Dalam tutorial ini kami mengilustrasikan beberapa cara untuk menggunakan Liquibase dan mendapatkan cara yang aman dan matang untuk mengembangkan dan memfaktorkan ulang skema DB dari aplikasi Java .

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek github saya - ini adalah proyek berbasis Eclipse, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.