Liquibase在多个数据库上

时间:2014-08-18 13:04:23

标签: maven liquibase

我已经用Maven实现了Liquibase。我们目前正在使用单个数据库(db2),但现在我们需要向具有不同对象的应用程序添加新数据库。

我已经看到我可以在maven中定义一个新的配置文件,但我无法找出如何区分在哪个数据库上创建哪些对象。

有解决方案吗?我可以使用liquibase支持具有不同对象的2个不同数据库吗?

3 个答案:

答案 0 :(得分:3)

您可能希望有两个单独的更改日志来管理这两个数据库,即使它们都由同一个应用程序使用。

答案 1 :(得分:3)

正如您在documentation中所看到的,您可以使用两种不同的执行方式,如下所示:

<plugin>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-maven-plugin</artifactId>
  <version>3.0.5</version>
  <executions>
    <execution>
      <phase>process-resources</phase>
      <configuration>
        <changeLogFile>PATH_TO_CHANGELOG_1</changeLogFile>
        ... connection properties  ...
      </configuration>
      <goals>
        <goal>update</goal>
      </goals>
    </execution>
   <execution>
      <phase>process-resources</phase>
      <configuration>
        <changeLogFile>PATH_TO_CHANGELOG_2</changeLogFile>
        ... connection properties  ...
      </configuration>
      <goals>
        <goal>update</goal>
      </goals>
    </execution>
  </executions>
</plugin>

此方法的唯一问题是您需要两个不同的changelog.xml文件,每个数据库一个。

此外,您可以在更改日志文件中使用preconditions,以便在每个数据库处理更改集之间进行选择。

例如:

<changeSet id="1" author="bob">
    <preConditions onFail="MARK_RAN">
         <dbms type="oracle" />
    </preConditions>
    <comment>Comments should go after preCondition. If they are before then liquibase usually gives error.</comment>
    <dropTable tableName="oldtable"/>
</changeSet>

onFail="MARK_RAN"使Liquibase跳过变更集但将其标记为运行,因此下次不再尝试。有关更复杂的前提条件,请参阅documentation中的customPrecondition标记。

答案 2 :(得分:0)

正如Arturo所说,你可以拥有2个或更多的执行节点,但你必须为每个执行节点分配一个单独的id。

                <plugin>
                    <groupId>org.liquibase</groupId>
                    <artifactId>liquibase-maven-plugin</artifactId>
                    <version>3.0.5</version>
                    <executions>
                        <execution>
                            <id>db1-update</id>
                            <phase>process-resources</phase>
                            <configuration>
                                <changeLogFile>src/main/resources/org/liquibase/db1.xml</changeLogFile>
                                <driver>org.postgresql.Driver</driver>
                                <url>jdbc:postgresql://localhost/db1</url>
                                <username>..</username>
                                <password>..</password>
                            </configuration>
                            <goals>
                                <goal>update</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>db2-update</id>
                            <phase>process-resources</phase>
                            <configuration>
                                <changeLogFile>src/main/resources/org/liquibase/db2.xml</changeLogFile>
                                <driver>org.postgresql.Driver</driver>
                                <url>jdbc:postgresql://localhost/db2</url>
                                <username>...</username>
                                <password>...</password>
                            </configuration>
                            <goals>
                                <goal>update</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>db3-update</id>
                            <phase>process-resources</phase>
                            <configuration>
                                <changeLogFile>src/main/resources/org/liquibase/db3.xml</changeLogFile>
                                <driver>org.postgresql.Driver</driver>
                                <url>jdbc:postgresql://localhost/db3</url>
                                <username>...</username>
                                <password>...</password>
                            </configuration>
                            <goals>
                                <goal>update</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>