首页 > 解决方案 > 从 liquibase 生成生产 sql

问题描述

我在我的 Spring Boot 应用程序上使用 liquibase 3.8.9 版本进行数据库版本控制,现在我需要为生产环境生成一个 sql(我们无法从应用程序运行 liquibase)。

我有一些我最近没有找到答案的问题:

  1. 我可以在没有 databasechangelog 和 databasechangeloglock 表的情况下生成 sql 吗?我认为在生产环境中使用它没有任何价值。

如果没有它们我无法生成,我看到 liquibase 不会为我生成 databasechangelog 和 databasechangeloglock 的创建,我可以配置 liquibase 以在不定义新变更集的情况下生成它们吗?

  1. 在某些更改集中,我有位于项目根目录中的文件,如下所示:

<include file="./liquibase/some-file.xml" relativeToChangelogFile="false"/>

当我运行应用程序时,更改集运行良好,但是当我尝试运行updateSQL时,我收到:

./liquibase/some-file.xml does not exist

我已经包含了根文件夹中的文件,因为它取决于环境。有没有办法包含文件以将其用于插件?

  1. 它是一种生成版本化 sql 的方法吗?例如,第一个版本应该是 1.0 版,如果我添加一个新列,它应该生成 1.1 版,只有新添加的列没有 1.0 版的 sql

此致

标签: springspring-bootliquibaseliquibase-hibernate

解决方案


  1. 我可以在没有 databasechangelog 和 databasechangeloglock 表的情况下生成 SQL 吗?我认为在生产环境中使用它没有任何价值?

为什么?liquibase 的特性就在这两张表上。Liquibase 使用 DATABASECHANGELOG 表来跟踪哪些变更集已经运行。

该表将每个变更集跟踪为一行,由“id”、“author”和“filename”列的组合标识。Liquibase 使用 DATABASECHANGELOGLOCK 表来确保一次只运行一个 Liquibase 实例。基本上,这两个表用于帮助您不要在您不知情的情况下再次运行相同的变更集,并提供一种机制来停止并发访问。

2.在一些更改集中,我在项目的根目录中有文件,如下所示:当我运行应用程序时,更改集运行良好,但是当我尝试运行 updateSQL 时,我收到:./liquibase/some -file.xml 不存在?

你是如何配置 liquibase 的。就我而言,我已经使用 spring boot 配置了 liquibase 并且还添加了 liquibase gradle 插件。由于这个相对路径问题,我所做的是,将changelog的logicalFilePath更改如下,并且还使用了相对路径文件。

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.4.xsd"
        logicalFilePath="schema/15-01-changelog-comment-order-header-table.xml">
    <changeSet id="10" author="sivaramr" dbms="postgresql" context="dev,qa,prod">
<changeset> ... </changeset>
</changelog>

当您配置主变更日志文件时,不要配置路径,而是使用默认路径。

spring.liquibase.change-log=classpath:db/changelog/changelog-master.xml
  1. 你可以使用标签来做到这一点,

使用 liquibase 进行版本控制

标记命令

tag 命令通常用于通过在 DATABASECHANGELOG 表的最后一行添加标记来标记当前数据库状态、版本、版本或任何其他信息

我们可以为数据库添加一个带有变更集的标签,如下所示。

在创建标签之前,我们必须通过 liquibase 命令检查标签是否已准备好

./gradlew tagExists -PliquibaseCommandValue=v1.0.0

我们可以使用以下命令将标签添加到数据库的最后一个变更集

./gradlew tag -PliquibaseCommandValue=v1.0.0

回滚标签命令

rollback 命令通常用于还原在您指定的标记之后对数据库所做的所有更改。

当您运行 rollback 时,Liquibase 将按顺序回滚所有已部署的更改,直到它到达 DATABASECHANGELOG 表中的标记行。

最佳实践是运行 rollbackSQL 命令,该命令允许您在运行命令之前检查潜在的错误。

./gradlew rollback -PliquibaseCommandValue=v1.0.0

推荐阅读