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

时间:2014-04-08 15:45:08

标签: maven maven-plugin liquibase

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

我们正在使用Liquibase将更改集应用于开发,但是对于生产,我们需要能够生成包含所有语句的* .sql文件。

根据liquibase-maven-plugin的文档,updateSQL应该是我想要的:http://www.liquibase.org/documentation/maven/maven_updatesql.html

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

  

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

没有提及它会实际应用更改集,例如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>

鉴于我的maven配置和我的理解,我希望

mvn install -P uat

仅生成脚本而不是尝试连接数据库。

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

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

提前致谢。

1 个答案:

答案 0 :(得分:11)

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

它需要数据库连接信息并建立实际连接的原因是因为它需要从databasechangelog表中选择以确定哪些changeSet已经运行,哪些没有。