liquibase
liquibase 可以帮助我们完成数据库脚本的管理以及迁移(在支持的情况下),使用起来也是非常的简单,在我们的环境比较多的时候尤为方便,省去了每次变动都要手动更改不同环境数据库的麻烦。更多的内容可以参阅官方文档。
liquibase 支持读取四种格式的文件:sql、xml、yaml、json。这几种文件的编写格式需要遵循 liquibase 的 官方定义。具体的写法本文也不予讲解,查阅官文即可。
如果后期不更换数据库,那么直接使用 sql 是最直观方便的。倘若后续需要数据库迁移,那么可以使用后三种的方式定义,选择哪种格式看自己的喜好,也可以混合使用,都是支持的。
liquibase 不会自动将变更写入文件中,需要我们手动添加更改,然后在不同环境中启动时,liquibase 会自动执行这些变更完成结构和数据的同步。这也是 liquibase 的核心工作内容。
为当前项目引入 liquibase
本文使用 maven 的方式,且假设现有项目使用的 pg,准备迁移至其它数据库。其它的方式可以参看官方文档。
引入依赖填写必要信息
<properties>
<liquibase.version>4.33.0</liquibase.version>
</properties>
<dependencies>
<!-- liquibase -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>${liquibase.version}</version>
</dependency>
<!-- 引入 pg 依赖 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.5</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>${liquibase.version}</version>
<configuration>
<!-- 输出的文件名,文件的格式可以自定义,这里选择的 xml -->
<!-- <outputChangeLogFile>changelog.xml</outputChangeLogFile> -->
<!-- 数据库连接信息 -->
<url>jdbc:mysql://localhost:3306/db</url>
<username>root</username>
<password>root</password>
</configuration>
</plugin>
</plugins>
</build>
打开命令行执行以下命令:
# 只会导出表结构
mvn liquibase:generateChangeLog
# 导出数据并指定路径(如果 xml 中配置了以 xml 为主,命令行不会生效)
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data -Dliquibase.outputChangeLogFile=output/changelog.xml
# 生成时排除某张表
# -Dliquibase.diffExcludeObjects=table_name
这样当前数据库的 liquibase 脚本文件就生成了。我们将其放在 liquibase 的默认目录下 resourcces/db/changelog/,后续有什么变动按照对应的语法更改一下,然后不同环境重新运行一下程序就可以完成结构和数据的同步了。
不同环境同步/迁移至其它数据库使用
上面的步骤中,我们将现有的项目使用的数据库进行了 liquibase 的脚本生成备份,我们需要将这些脚本文件用起来,同步到其它的环境中或者是迁移至其它数据库中。
引入的依赖和上面相同,但此时不需要 liquibase-maven-plugin 插件。如果是迁移到其它数据库,需要引入相应的数据库的驱动,并更改配置文件 appllication.yml 的 database 连接信息。
在项目的 resources 目录(也是 liquibase 默认读取的文件路径)中创建 db/changelog/db.changelog-master.yaml 文件,内容如下:
databaseChangeLog:
- include:
relativeToChangelogFile: true
file: changelog.xml
其中 changelog.xml 文件和 db.changelog-master.yaml 文件同级。然后启动我们的数据库即可完成同步/迁移。
注意:本文全篇不在
application.yml中配置 liquibase 的任何信息,使用的都是 liquibase 默认读取的文件名(db.changelog-master.sql,yml,json,xml)和路径名(resourcces/db/changelog),如果需要自定义则需要更改相关配置。 默认的主文件名称必须是db.changelog-master.yaml,后缀不可写成yml。 目前,liquibase 的 gradle 使用方式是 社区支持,且没有 kts 版。如果想要更好、更完善的迁移工具,可以考虑使用 flyway。

说些什么吧!