编辑此页面

使用 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 扩展添加到您的项目中

CLI
quarkus extension add liquibase-mongodb
Maven
./mvnw quarkus:add-extension -Dextensions='liquibase-mongodb'
Gradle
./gradlew addExtension --extensions='liquibase-mongodb'

这会将以下内容添加到您的构建文件中

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-liquibase-mongodb</artifactId>
</dependency>
build.gradle
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 初始化 JobJob 执行初始化,而实际的 PodJob 成功完成后启动。

禁用

该功能默认启用,可以使用以下方式全局禁用

quarkus.kubernetes.init-task-defaults.enabled=false

或在 OpenShift 上

quarkus.openshift.init-task-defaults.enabled=false

使用控制等待 Job 的自定义镜像

要更改默认的 wait-for 镜像 groundnuty/k8s-wait-for:no-root-v1.7,您可以使用

quarkus.kubernetes.init-task-defaults.wait-for-container.image=my/wait-for-image:1.0

或在 OpenShift 上

quarkus.openshift.init-task-defaults.wait-for-container.image=my/wait-for-image:1.0

注意:在此上下文中,全局意味着对于所有支持初始化任务外部化的扩展

配置参考

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

变更日志文件

环境变量: QUARKUS_LIQUIBASE_MONGODB_CHANGE_LOG

显示更多

字符串

db/changeLog.xml

DirectoryResourceAccessor 的搜索路径

环境变量: QUARKUS_LIQUIBASE_MONGODB_SEARCH_PATH

显示更多

字符串列表

启用/禁用 Liquibase 的标志。

环境变量: QUARKUS_LIQUIBASE_MONGODB_ENABLED

显示更多

布尔值

true

连接数据库时使用的 Mongodb 客户端名称,默认为默认的 mongodb 客户端。

环境变量: QUARKUS_LIQUIBASE_MONGODB_MONGO_CLIENT_NAME

显示更多

字符串

启动时迁移标志

环境变量: QUARKUS_LIQUIBASE_MONGODB_MIGRATE_AT_START

显示更多

布尔值

false

更新时验证标志

环境变量: QUARKUS_LIQUIBASE_MONGODB_VALIDATE_ON_MIGRATE

显示更多

布尔值

true

启动时清理标志

环境变量: QUARKUS_LIQUIBASE_MONGODB_CLEAN_AT_START

显示更多

布尔值

false

要传递给变更日志的参数。定义为键值对。

环境变量: QUARKUS_LIQUIBASE_MONGODB_CHANGE_LOG_PARAMETERS__CHANGE_LOG_PARAMETERS_

显示更多

Map<String,String>

上下文列表

环境变量: QUARKUS_LIQUIBASE_MONGODB_CONTEXTS

显示更多

字符串列表

标签列表

环境变量: QUARKUS_LIQUIBASE_MONGODB_LABELS

显示更多

字符串列表

默认目录名称

环境变量: QUARKUS_LIQUIBASE_MONGODB_DEFAULT_CATALOG_NAME

显示更多

字符串

默认模式名称

环境变量: QUARKUS_LIQUIBASE_MONGODB_DEFAULT_SCHEMA_NAME

显示更多

字符串

liquibase 表目录名称

环境变量: QUARKUS_LIQUIBASE_MONGODB_LIQUIBASE_CATALOG_NAME

显示更多

字符串

liquibase 表模式名称

环境变量: QUARKUS_LIQUIBASE_MONGODB_LIQUIBASE_SCHEMA_NAME

显示更多

字符串

liquibase 表空间名称

环境变量: QUARKUS_LIQUIBASE_MONGODB_LIQUIBASE_TABLESPACE_NAME

显示更多

字符串

相关内容