我的应用程序中的数据库方案由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 Server脚本/ H2之间存在一些兼容性问题,这是因为如果我从迁移脚本中删除行SET XACT_ABORT[*] ON,则会给我另一个错误。

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

最佳答案

这是数据库生成的错误,没有Flyway错误。您正在使用的两个DBMS不完全兼容:H2中不提供MS SQL Server接受的某些数据类型,函数等,SQL语法也不相同,依此类推。产生错误的语句特定于MS SQL Server(请参见docs

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

告诉我们您的持久层,您使用的是什么框架?

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

10-01 04:48
查看更多