Memilih antara XML dan SQL untuk menggulung skrip LiquiBase menggunakan Java / Spring / H2 sebagai contoh

Dalam proses mengerjakan proyek selanjutnya, tim tersebut memperdebatkan penggunaan format XML atau SQL di Liquibase. Secara alami, banyak artikel telah ditulis tentang Liquibase, tetapi seperti biasa, saya ingin menambahkan pengamatan saya. Artikel ini akan menyajikan tutorial kecil tentang cara membuat aplikasi sederhana dengan basis data dan mempertimbangkan perbedaan dalam meta-informasi untuk jenis ini.

Liquibase adalah pustaka independen basis data untuk melacak, mengelola, dan menerapkan perubahan skema basis data. Untuk membuat perubahan pada database, file migrasi (* changeset *) dibuat, yang terhubung ke file utama (* changeLog *), yang mengontrol versi dan mengelola semua perubahan. Format XML , YAML , JSON dan SQL digunakan untuk menggambarkan struktur dan perubahan database.

Konsep dasar migrasi basis data adalah sebagai berikut:



Informasi lebih lanjut tentang Liquibase dapat ditemukan di sini atau di sini . Saya harap gambaran keseluruhannya jelas, jadi mari kita beralih ke membuat proyek.

Proyek uji menggunakan


  • Java 8
  • Boot musim semi
  • Maven
  • H2
  • well liquibase sendiri

Penciptaan dan Ketergantungan Proyek


Penggunaan Spring-boot tidak bersyarat di sini, Anda bisa melakukan hanya maven-plugin untuk skrip bergulir. Jadi mari kita mulai.

1. Buat proyek pakar dalam IDE dan tambahkan dependensi berikut ke file pom:

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>3.6.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> </dependencies> 

2. Di folder sumber daya, buat file application.yml dan tambahkan baris berikut:

 spring: liquibase: change-log: classpath:/db/changelog/db.changelog-master.yaml datasource: url: jdbc:h2:mem:test; platform: h2 username: sa password: driverClassName: org.h2.Driver h2: console: enabled: true 

Baris Liquibase: change-log: classpath: /db/changelog/db.changelog-master.yaml - memberi tahu kami di mana file skrip liquibase berada.

3. Di folder sumber daya di sepanjang jalur db.changelog-master, buat file berikut:

  • xmlSchema.xml - ubah skrip dalam format xml
  • sqlSchema.sql - skrip perubahan dalam format sql
  • data.xml - tambahkan data ke tabel
  • db.changelog-master.yml - daftar changeSets

4. Menambahkan data ke file:
Untuk tes ini Anda harus membuat dua t yang tidak terkait
tabel dan kumpulan data minimum.
Dalam file sqlSchema.sql, kami menambahkan sintaks sql yang terkenal untuk semua orang:

 --liquibase formatted sql --changeset TestUsers_sql:1 CREATE TABLE test_sql_table ( name VARCHAR NOT NULL, description VARCHAR ); --changeset TestUsers_sql:2 CREATE TABLE test_sql_table_2 ( name VARCHAR NOT NULL, description VARCHAR ); 

Menggunakan sql sebagai changeet didorong oleh scripting yang mudah. Dalam file, semua orang memahami sql yang biasa.

Sebuah komentar digunakan untuk memisahkan perubahan:
--changeset TestUsers_sql: 1 dengan nomor perubahan dan nama belakang
(parameter dapat ditemukan di sini .)

Dalam file xmlSchema.sql, tambahkan DSL yang disediakan liquibase:

 <?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> <changeSet id="Create table test_xml_table" author="TestUsers_xml"> <createTable tableName="test_xml_table"> <column name="name" type="character varying"> <constraints primaryKey="true" nullable="false"/> </column> <column name="description" type="character varying"/> </createTable> </changeSet> <changeSet id="Create table test_xml_table_2" author="TestUsers_xml"> <createTable tableName="test_xml_table_2"> <column name="name" type="character varying"> <constraints primaryKey="true" nullable="false"/> </column> <column name="description" type="character varying"/> </createTable> </changeSet> </databaseChangeLog> 

Format ini untuk menggambarkan pembuatan tabel bersifat universal untuk database yang berbeda. Sama seperti slogan Jawa: "Ini ditulis sekali, ia bekerja di mana-mana . " Liquibase menggunakan deskripsi xml dan mengkompilasinya ke dalam kode sql tertentu, tergantung pada database yang dipilih. Yang sangat nyaman untuk parameter umum.

Setiap operasi dilakukan dalam set perubahan terpisah, yang menunjukkan id dan nama penulis. Saya pikir bahasa yang digunakan dalam xml sangat mudah dimengerti dan bahkan tidak perlu dijelaskan.

5. Unggah data ke piring kami, ini tidak perlu, tetapi karena piring telah dibuat, Anda harus memasukkan sesuatu ke dalamnya. Kami mengisi file data.xml dengan data berikut:

 <?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> <changeSet id="insert data to test_xml_table" author="TestUsers"> <insert tableName="test_xml_table"> <column name="name" value="model"/> <column name="description" value="- "/> </insert> </changeSet> <changeSet id="insert data to test_xml_table_2" author="TestUsers"> <insert tableName="test_xml_table_2"> <column name="name" value="model"/> <column name="description" value="- "/> </insert> </changeSet> <changeSet id="insert data to test_sql_table" author="TestUsers"> <insert tableName="test_sql_table"> <column name="name" value="model"/> <column name="description" value="- "/> </insert> </changeSet> <changeSet id="insert data to test_sql_table_2" author="TestUsers"> <insert tableName="test_sql_table_2"> <column name="name" value="model"/> <column name="description" value="- "/> </insert> </changeSet> </databaseChangeLog> 

File untuk tabel bergulir dibuat, data untuk tabel dibuat. Saatnya menggabungkan semua ini menjadi urutan bergulir yang umum dan meluncurkan aplikasi kami.

Tambahkan file sql dan xml kami ke file db.changelog-master.yml:

 databaseChangeLog: - include: # schema file: db/changelog/xmlSchema.xml - include: file: db/changelog/sqlSchema.sql # data - include: file: db/changelog/data.xml 

Dan sekarang kita telah memiliki segalanya. Jalankan saja aplikasi kita. Anda dapat menggunakan baris perintah atau plugin untuk memulai, tetapi kami hanya akan membuat metode utama dan menjalankan SpringApplication kami.

Lihat metadata


Sekarang kita telah menjalankan dua skrip untuk membuat dan mengisi tabel, kita dapat melihat tabel databaseChangeLog dan melihat apa yang digulung.



Hasil rolling xml:

  1. Di bidang id dari file xml, tajuk muncul bahwa pengembang menunjuk ke changeSet, setiap individu changeSet adalah baris terpisah dalam database dengan judul dan deskripsi.
  2. Penulis setiap perubahan ditunjukkan.

Sql hasil roll:

  1. Tidak ada informasi terperinci tentang changeSet di bidang id file sql.
  2. Penulis setiap perubahan tidak ditunjukkan.

Kesimpulan penting lain untuk menggunakan xml adalah rollback. Perintah seperti membuat tabel, mengubah tabel, menambahkan kolom memiliki rollback otomatis saat menggunakan xml. Untuk file sql, setiap rollback harus ditulis secara manual.

Kesimpulan


Semua orang memilih sendiri apa yang akan digunakan. Tapi pilihan kita jatuh pada sisi xml. Meta-informasi terperinci dan transisi mudah ke database lain, melebihi skala dari format sql favorit semua orang.

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


All Articles