Flyway 迁移在 MS SQL 服务器中成功,但在 H2 数据库中失败

Flyway migration succeeds in MS SQL Server but fails in H2 database

我的应用程序中的数据库方案由 Flyway 迁移管理。这些迁移是为 MS SQL Server 设计的,并且已经执行了很多次,没有任何问题。

我决定在 运行 测试之前重新使用迁移来设置测试数据库 (H2)。并为此在 Spring 上下文中创建了以下 bean:

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.h2.Driver");
    // Scheme = test_db, Compatibility mode = MSSQLServer
    dataSource.setUrl("jdbc:h2:mem:test_db;MODE=MSSQLServer;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;" +
            "INIT=CREATE SCHEMA IF NOT EXISTS test_db\;SET SCHEMA test_db");
    dataSource.setUsername("sa");
    dataSource.setPassword("");

    return dataSource;
}

@Bean
public Flyway flyway() {
    Flyway flyway = new Flyway();
    flyway.setDataSource(dataSource());
    flyway.setSchemas("test_db");
    flyway.setLocations("filesystem:db\migration");
    flyway.migrate();  // Exception is thrown from here !!!
    return flyway;
}

但是在 Spring 上下文初始化期间,我收到以下异常,说明我的迁移脚本的第一行存在语法错误:

org.flywaydb.core.internal.dbsupport.FlywaySqlScriptException: Migration V1__init.sql failed

SQL State  : 42001
Error Code : 42001
Message    : Syntax error in SQL statement "SET XACT_ABORT[*] ON
...

显然 Flyway / MS SQL 服务器脚本 / H2 之间存在一些 兼容性问题,因为如果我从迁移脚本中删除行 SET XACT_ABORT[*] ON,它给了我另一个错误。

我是使用内存数据库的新手,我想保持 Flyway 迁移不变。其他可能的解决方案是什么?

这是数据库生成的错误,不是 Flyway 错误。您使用的两个 DBMS 不完全兼容:MS SQL Server 接受的一些数据类型、函数等在 H2 中不可用,SQL 语法不相同等等。生成错误的语句特定于 MS SQL 服务器(参见 docs

我不知道 Flyway 会自动翻译您使用的 DML 脚本的任何方式。您必须自己创建内存模式。除非有人知道任何自动执行此操作的工具。

说说你的持久层,你用的是什么框架?

如果您正在测试 JPA Hibernate 应用程序,那么您可以在运行时启用架构的自动生成(通过在测试应用程序上下文使用的 persistence.xml 中设置 hibernate.hbm2ddl.auto 属性) .当然,您仍然需要用数据填充您的架构。可能您的脚本适用于此。对此的手动解决方案可能是,在任何测试开始之前,打开与主数据库的第二个数据库连接,选择域对象中需要的数据,然后通过内存中的数据库连接持久化它们。我没试过,只是一个想法...