使用 Liquibase MongoDB
Liquibase 是一个用于数据库模式变更管理的开源工具,它允许通过其 MongoDB 扩展 来管理 MongoDB 数据库。
Quarkus 在使用 Liquibase MongoDB 扩展方面提供了头等支持,本指南将对此进行说明。
解决方案
我们建议您按照以下章节中的说明,逐步创建应用程序。但是,您可以直接转到完整的示例。
克隆 Git 存储库: git clone https://github.com/quarkusio/quarkus-quickstarts.git
,或下载 归档文件。
解决方案位于 liquibase-mongodb-quickstart
目录中。
设置 Liquibase 支持
要开始在您的项目中使用 Liquibase MongoDB 扩展,您只需要
-
像往常一样将您的 changeLog 添加到
src/main/resources/db/changeLog.xml
文件中 -
激活
migrate-at-start
选项以自动迁移模式,或注入Liquibase
对象并按正常方式运行您的迁移。
您可以通过在项目根目录中运行以下命令将 liquibase-mongodb
扩展添加到您的项目中
quarkus extension add liquibase-mongodb
./mvnw quarkus:add-extension -Dextensions='liquibase-mongodb'
./gradlew addExtension --extensions='liquibase-mongodb'
这会将以下内容添加到您的构建文件中
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-liquibase-mongodb</artifactId>
</dependency>
implementation("io.quarkus:quarkus-liquibase-mongodb")
Liquibase MongoDB 扩展支持依赖于 Quarkus MongoDB 客户端配置。目前,它不支持多个客户端。您需要将 MongoDB 配置添加到 application.properties
文件中,以便 Liquibase 管理模式。
以下是 application.properties
文件的示例
# configure MongoDB
quarkus.mongodb.connection-string = mongodb://:27017/mydatabase
# Liquibase MongoDB minimal config properties
quarkus.liquibase-mongodb.migrate-at-start=true
# Liquibase MongoDB optional config properties
# quarkus.liquibase-mongodb.change-log=db/changeLog.xml
# quarkus.liquibase-mongodb.validate-on-migrate=true
# quarkus.liquibase-mongodb.clean-at-start=false
# quarkus.liquibase-mongodb.contexts=Context1,Context2
# quarkus.liquibase-mongodb.labels=Label1,Label2
# quarkus.liquibase-mongodb.default-catalog-name=DefaultCatalog
# quarkus.liquibase-mongodb.default-schema-name=DefaultSchema
Liquibase 需要数据库,可以在连接字符串中提供,也可以通过 quarkus.mongodb.database 属性提供。 |
默认情况下,Liquibase MongoDB 配置为使用 Quarkus 创建的默认 MongoDB 客户端,但您可以通过设置 quarkus.liquibase-mongodb.mongo-client-name 来配置扩展以使用命名客户端。 |
按照 Liquibase 命名约定,将 changeLog 文件添加到默认文件夹: src/main/resources/db/changeLog.xml
支持 YAML、JSON 和 XML 格式的 changeLog。
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<changeSet id="1" author="loic">
<ext:createCollection collectionName="Fruit"/>
<ext:createIndex collectionName="Fruit">
<ext:keys>{color: 1}</ext:keys>
<ext:options>{name: "colorIdx"}</ext:options>
</ext:createIndex>
<ext:insertOne collectionName="Fruit">
<ext:document>{"name":"orange", "color": "orange"}</ext:document>
</ext:insertOne>
</changeSet>
</databaseChangeLog>
现在您可以启动您的应用程序,Quarkus 将根据您的配置运行 Liquibase 的 update 方法。
使用 Liquibase 对象
如果您有兴趣直接使用 Liquibase
对象,您可以如下注入它
如果您启用了 quarkus.liquibase.migrate-at-start 属性,当您使用 Liquibase 实例时,Quarkus 将已经运行了 migrate 操作。 |
import io.quarkus.liquibase.LiquibaseFactory;
@ApplicationScoped
public class MigrationService {
// You can Inject the object if you want to use it manually
@Inject
LiquibaseMongodbFactory liquibaseMongodbFactory; (1)
public void checkMigration() {
// Use the liquibase instance manually
try (Liquibase liquibase = liquibaseFactory.createLiquibase()) {
liquibase.dropAll(); (2)
liquibase.validate();
liquibase.update(liquibaseFactory.createContexts(), liquibaseFactory.createLabels());
// Get the list of liquibase change set statuses
List<ChangeSetStatus> status = liquibase.getChangeSetStatuses(liquibaseFactory.createContexts(), liquibaseFactory.createLabels()); (3)
}
}
}
1 | 注入 LiquibaseFactory 对象 |
2 | 直接使用 Liquibase 实例 |
3 | 已应用或未应用的 liquibase ChangeSets 列表 |
Kubernetes 上的 Liquibase Mongodb
有时,避免在每次应用程序启动时都执行 Liquibase 初始化很有用。一个例子是在 Kubernetes 上部署时,在每个副本上执行 Liquibase 没有意义。相反,希望只执行一次,然后启动实际的应用程序而不带 Liquibase。为了支持这种情况,在生成 Kubernetes 清单时,生成的清单包含一个 Liquibase 的 Kubernetes 初始化 Job
。Job
执行初始化,而实际的 Pod
在 Job
成功完成后启动。
配置参考
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
配置属性 |
类型 |
默认 |
---|---|---|
字符串 |
|
|
DirectoryResourceAccessor 的搜索路径 环境变量: 显示更多 |
字符串列表 |
|
布尔值 |
|
|
连接数据库时使用的 Mongodb 客户端名称,默认为默认的 mongodb 客户端。 环境变量: 显示更多 |
字符串 |
|
启动时迁移标志 环境变量: 显示更多 |
布尔值 |
|
更新时验证标志 环境变量: 显示更多 |
布尔值 |
|
启动时清理标志 环境变量: 显示更多 |
布尔值 |
|
要传递给变更日志的参数。定义为键值对。 环境变量: 显示更多 |
Map<String,String> |
|
字符串列表 |
||
字符串列表 |
||
默认目录名称 环境变量: 显示更多 |
字符串 |
|
默认模式名称 环境变量: 显示更多 |
字符串 |
|
liquibase 表目录名称 环境变量: 显示更多 |
字符串 |
|
liquibase 表模式名称 环境变量: 显示更多 |
字符串 |
|
liquibase 表空间名称 环境变量: 显示更多 |
字符串 |