【问题标题】:Generate production sql from liquibase从 liquibase 生成生产 sql
【发布时间】:2021-09-17 16:04:58
【问题描述】:

我在我的 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

最好的问候

【问题讨论】:

    标签: spring spring-boot liquibase liquibase-hibernate


    【解决方案1】:
    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 表的最后一行添加 tag 来标记当前数据库状态、版本、版本或任何其他信息

    我们可以为数据库添加如下变更集的标签。

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

    ./gradlew tagExists -PliquibaseCommandValue=v1.0.0
    

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

    ./gradlew tag -PliquibaseCommandValue=v1.0.0
    
    

    回滚标签命令

    回滚命令通常用于恢复在您指定的标记之后对数据库所做的所有更改。

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

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

    ./gradlew rollback -PliquibaseCommandValue=v1.0.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2017-06-23
      • 2017-02-11
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      相关资源
      最近更新 更多