以Java / Spring / H2为例,在XML和SQL之间进行选择以滚动LiquiBase脚本

在进行下一个项目的过程中,团队对Liquibase中XML或SQL格式的使用存在争议。 自然,已经有许多关于Liquibase的文章,但是和往常一样,我想补充一下我的看法。 本文将提供一个有关使用数据库创建简单应用程序的小教程,并考虑这些类型的元信息的区别。

Liquibase是一个独立于数据库的库,用于跟踪,管理和应用数据库架构更改。 为了更改数据库,创建了一个迁移文件(* changeset *),该文件与主文件(* changeLog *)连接,该文件控制版本并管理所有更改。 XMLYAMLJSONSQL格式用于描述数据库的结构和更改。

数据库迁移的基本概念如下:



有关Liquibase的更多信息,请参见此处此处 。 我希望总体情况清楚,所以让我们继续创建项目。

测试项目使用


  • Java 8
  • 春季靴
  • 马文
  • H2
  • 良好的液基本身

项目创建和依赖


这里没有条件使用Spring-boot,您可以只使用一个maven插件来滚动脚本。 因此,让我们开始吧。

1.在IDE中创建一个maven项目,并将以下依赖项添加到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.在资源文件夹中,创建application.yml文件并添加以下行:

 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 

Liquibase行:change-log:类路径:/db/changelog/db.changelog-master.yaml-告诉我们liquibase脚本文件位于何处。

3.在db.changelog-master路径下的resources文件夹中,创建以下文件:

  • xmlSchema.xml-以xml格式更改脚本
  • sqlSchema.sql-sql格式的更改脚本
  • data.xml-将数据添加到表
  • db.changelog-master.yml-changeSet列表

4.向文件添加数据:
对于测试,您需要创建两个不相关的
表和最小数据集。
在sqlSchema.sql文件中,我们向所有人添加了众所周知的sql语法:

 --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 ); 

使用sql作为变更码是由简单的脚本驱动的。 在文件中,每个人都可以理解通常的sql。

注释用于分隔变更集:
--changeset TestUsers_sql:1,带有更改号和姓氏
(参数可以在这里找到。)

在xmlSchema.sql文件中,添加liquibase提供的DSL:

 <?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> 

描述表创建的这种格式对于不同的数据库是通用的。 就像Java的口号一样: “它只编写一次,就可以在任何地方使用 Liquibase使用xml描述并将其编译为特定的sql代码,具体取决于所选的数据库。 这对于常规参数非常方便。

每个操作都在单独的changeSet中执行,指示id和作者的姓名。 我认为xml中使用的语言非常容易理解,甚至不需要解释。

5.将数据上传到我们的印版中,这不是必需的,但是由于已经制作了印版,因此您需要在其中放入一些东西。 我们用以下数据填充data.xml文件:

 <?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> 

创建用于滚动表的文件,创建用于表的数据。 现在是时候将所有这些组合成一个通用的滚动订单并启动我们的应用程序了。

将我们的sql和xml文件添加到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 

现在我们已经创建了所有东西。 只需运行我们的应用程序。 您可以使用命令行或插件来启动,但是我们将只创建main方法并运行SpringApplication。

查看元数据


现在,我们已经运行了两个脚本来创建和填充表,我们可以查看databaseChangeLog表并查看汇总的内容。



滚动xml的结果:

  1. 在xml文件的id字段中,出现了一个标题,指示开发人员指向changeSet,每个单独的changeSet都是数据库中带有标题和描述的单独行。
  2. 指出了每个更改的作者。

SQL滚动结果:

  1. 在SQL文件的ID字段中没有关于changeSet的详细信息。
  2. 没有指出每个更改的作者。

使用xml的另一个重要结论是回滚。 使用xml时,诸如create table,alter table,add column之类的命令会自动回滚。 对于sql文件,每个回滚必须手动编写。

结论


每个人都自己选择使用什么。 但是我们的选择落在了xml方面。 详细的元信息和轻松过渡到其他数据库的能力,超出了每个人都喜欢的sql格式的范围。

Source: https://habr.com/ru/post/zh-CN466651/


All Articles