用于控制多个数据库的 dbms 更改的 flyway 位置

Posted

技术标签:

【中文标题】用于控制多个数据库的 dbms 更改的 flyway 位置【英文标题】:flyway locations to control dbms changes for multiple DBs 【发布时间】:2017-10-27 14:40:58 【问题描述】:

我的 flyway 配置 - 使用 mvn 包运行 flyway

<plugin>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-maven-plugin</artifactId>
            <version>4.2.0</version>
            <configuration>
                <locations>
                    <location>db.migration.h2</location>
                </locations>
            </configuration>
        </plugin>

我有一个适用于一个数据库(使用 h2 数据库引擎)的 maven 应用程序我需要支持到其他数据库系统(db2、oracle ee、postgres)的 flyway。在另一个项目上,我们正在做类似的 flyway 配置文件flyway 版本 3.2.1 用于管理 H2 和 timesten 之间的表创建。

(新发现)当我在 hte pom 文件中使用 flyway 位置或配置文件条目时。 “mvn clean package”可以正常使用。但是“mvn verify”给我的错误是它有多个 V#_# 文件。

我在以下目录结构中有 H2 flyway 文件

atdd/src/main/java/db/migration/V1_2__comment.java
atdd/src/main/resources/db/migration/V1_1__create_tables.sql

我在迁移下创建了一个子目录“h2”,并将 flyway 文件移动到该子目录中。

我在“db/migration/db2”和“db/migration/oracle_ee”中复制了这些文件的 db 和 oracle ee 版本

RUNNING maven 包只给我:

Caused by: org.flywaydb.core.api.FlywayException: Found more than one migration with version 1.1
Offenders:
->/Users/XXXXX/Documents/fun/atdd/target/classes/db/migration/h2/V1_1__create_tables.sql (SQL)
->/Users/xxxxxx/Documents/fun/atdd/target/classes/db/migration/db2/V1_1__create_tables.sql (SQL)

我尝试过使用属性文件,但也不起作用

   <plugin>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-maven-plugin</artifactId>
            <version>4.2.0</version>

            <configuration>
                   <configFile>./flyway.properties</configFile>
            </configuration>
        </plugin>

atdd/flyway.properties 有

 flyway.locations=db.migration.h2

似乎是运行回归测试的问题(surefire 插件 - 我对 maven 相当陌生) Surefire 插件有什么特别之处吗?

【问题讨论】:

【参考方案1】:

有一个解决方法,您可以尝试使用Flyway.setLocations ("some/path/test.sql")从程序中显式设置位置

【讨论】:

【参考方案2】:

我可以通过向故障安全插件添加配置参数来开始工作

 <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version><!--$NO-MVN-MAN-VER$ -->
            <configuration><argLine>-Dflyway.locations=db.migrtion.h2</argLine></configuration>
            <executions>

mvn clean package  verify site -Dflyway.locations=db.migration.h2 

如果我没有“-Dflyway.locations=db.migration.h2”,奇怪的是不起作用

【讨论】:

【参考方案3】:

Flyway 递归搜索整个类路径以寻找要应用的迁移。 “递归”一词意味着检查嵌套在其他文件夹中的文件夹。

因此,您的所有 SQL 文件都已找到。 Flyway 无法知道应该使用或忽略哪些嵌套文件夹。

正如另一个答案所建议的那样,如果您希望忽略某些誓言,则必须明确指定所需的文件夹。

【讨论】:

是的,我想明确列出路径。我发现有趣的是,如果我将文件从 db.migration.db2 和 db.migration.h2 移动到 db.db2 和 db.h2 并将位置设置为 db.h2 一切正常。最新的flyway版本总是想从db.migration往下搜索。我不能告诉它只搜索 db.migration 的子目录。但我的另一个项目使用的是 flyway 2.3.1,它限制了对 db.migration 的特定子目录的搜索。 @petercooke 请编辑您的问题,并在该评论中进行说明。

以上是关于用于控制多个数据库的 dbms 更改的 flyway 位置的主要内容,如果未能解决你的问题,请参考以下文章

DBMS 的发展史是啥 ?

一个数据库管理系统可以包含多个数据表?

随笔21 DBMS

DMS系统怎么用?

什么是数据库管理系统?

hutool 数据库配置 必须写死吗?