当前位置: 首页 > 知识库问答 >
问题:

Liquibase - 生成脚本而不将变更集应用于数据库

诸葛乐逸
2023-03-14

在我目前的项目中,有一个数据库团队在将它们应用到生产环境之前检查所有脚本。

我们使用Liquibase将变更集应用到开发中,但是对于生产,我们需要能够生成一个*。包含所有语句的sql文件。

根据液基-专家-插件的文档,updateSQL应该是我想要的:http://www.liquibase.org/documentation/maven/maven_updatesql.html

所以我创建了两个maven配置文件。一个用于将更改应用到本地开发数据库(使用liquibase:update),另一个仅用于生成脚本。问题是:执行liquibase:updateSQL确实会生成*。sql文件(如预期),但它也尝试连接到数据库并应用更改(未预期)。我相信updateSQL的文档会导致错误,正如它所说的:

生成将数据库更新到DatabaseChangeLogs中指定的当前版本所需的SQL。

没有提到它实际上会应用变更集,就像liquibase: update一样。

我可能错过了这里的文档,但更新SQL不应该只生成sql,或者它实际上应该更新生成sql吗?

这是我的插件配置:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.0.5</version>
    <configuration>
        <changeLogFile>src/main/resources/db/liquibase_changeset.xml</changeLogFile>
        <driver>oracle.jdbc.driver.OracleDriver</driver>
        <url>${liquibase.db.url}</url>
        <username>${liquibase.db.user}</username>
        <password>${liquibase.db.password}</password>
        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
    </configuration>
    <executions>
        <execution>
            <phase>process-resources</phase>
            <goals>
                <goal>${liquibase.exec.goal}</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我创建了这样的配置文件:

<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <liquibase.exec.goal>update</liquibase.exec.goal>
            <liquibase.exec.prompt>false</liquibase.exec.prompt>
            <liquibase.db.url>jdbc:oracle:thin:@host:1521:xe</liquibase.db.url>
            <liquibase.db.user>user</liquibase.db.user>
            <liquibase.db.password>password</liquibase.db.password>
        </properties>
    </profile>

    <profile>
        <id>uat</id>
        <properties>
            <liquibase.exec.goal>updateSQL</liquibase.exec.goal>
            <liquibase.exec.prompt>true</liquibase.exec.prompt>
            <liquibase.db.url>jdbc:oracle:thin:@host2:1521:xe</liquibase.db.url>
            <liquibase.db.user>user2</liquibase.db.user>
            <liquibase.db.password>password2</liquibase.db.password>
        </properties>
    </profile>
</profiles>

鉴于我的专家配置和我的理解,我期望

mvn install -P uat

只生成脚本而不尝试连接到数据库。

我被迫指定db属性(驱动程序等)的事实使我相信这是为了总是更改数据库,但我认为应该可以只生成脚本而不尝试对数据库应用更改。

有什么想法吗?有可能但我完全走错了路吗?或者我错过了一些简单的财产?还是根本不支持?

提前谢谢。

共有1个答案

苏选
2023-03-14

UpdateSQL实际上并不更新数据库,它只是输出SQL。

它需要数据库连接信息并建立实际连接的原因,因为它需要从数据库更改日志表中进行选择,以确定哪些更改集已运行,哪些尚未运行。

 类似资料:
  • 问题内容: 首先,有一点背景。我有一套Java应用程序,有些基于JPA,有些则没有。为了创建数据库,我目前正在使用Hibernates模式导出来为使用JPA的用户生成创建脚本。那些不使用JPA的人会手工生成脚本。然后使用ANT在应用程序安装过程中运行它们。对于更新,应用程序安装程序只需将更新脚本应用于数据库。 为了改善数据库更新的管理,我一直在研究Flyway和Liquibase。两者似乎几乎都可

  • 首先,一点背景。我有一组Java应用程序,有些基于JPA,有些不是。要创建我的数据库,我目前正在使用Hibernates模式导出为那些使用JPA的人生成创建脚本。那些不使用JPA的人我手动生成脚本。然后在应用程序安装期间使用ANT运行这些脚本。对于更新,应用程序安装程序只需将更新脚本应用于数据库。 为了改进数据库更新的管理,我一直在研究Flyway和Liquibase。这两个脚本似乎几乎都能满足我

  • 我还可以为不同的DBs生成不同的变更集,只要它在相同的migration.xml中即可 有什么办法可以做到这一点吗?

  • 我有一个使用Liquibase for PostgreSQL定义的现有模式。我正在添加对Oracle的支持,这需要进行重大更改。有些create-table标记只需更改数据类型即可工作,有些则不然(需要sql更改)。当前的changelog-schema文件在单个change-set下有多个create-table语句(我知道这不是一个好的设计,但这正是我现在要处理的),为了重用那些create-

  • 我已经用Spring试用过LiquiBase3.0测试版了(顺便说一句,它不适合2.0)。很顺利。 现在,我正在用Ant和相同的数据库和changelog测试它,在回滚所有更改并删除表DATABASECHANGELOG和DatabaseChangeloglock之后。 问题是liquibase将所有更改集记录在表DATABASECHANGELOG中,这意味着我的配置中没有任何错误,但它没有将更改提

  • 我们使用liquibase对数据库进行源代码控制。最初,我们从Postgres开始,创建了数据类型为特定于Postgres的列的变更集。 例如,我们有一个变更集,它创建了具有“JSON”类型字段的表。现在,我们想转移到其他数据库。因此,当我们针对另一个数据库运行变更集时,它无法创建表。我尝试添加“failOnError=false”。但是,后面的变更集失败,因为该表不存在。 您能建议如何重构旧的变