我的应用程序中的数据库方案由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迁移。有哪些其他可能的解决方案?
答案 0 :(得分:1)
这是数据库生成的错误,没有Flyway错误。您使用的两个DBMS不完全兼容:MS SQL Server接受的某些数据类型,函数等在H2中不可用,SQL语法不相同,依此类推。生成错误的语句特定于MS SQL Server(请参阅docs)
我不知道Flyway会自动翻译您使用的DML脚本。您必须自己创建内存模式。除非有人知道任何自动执行此操作的工具。
告诉我们您的持久层,您使用的是什么框架?
如果您正在测试JPA Hibernate应用程序,那么您可以在运行时启用模式的自动生成(通过在测试应用程序上下文使用的persistence.xml中设置hibernate.hbm2ddl.auto属性)。当然,您仍然需要使用数据填充模式。可能你的脚本适用于此。在任何测试开始之前,可以手动解决此问题,打开与主数据库的第二个DB连接,在域对象中选择所需的数据,然后通过内存数据库连接保留它们。我没试过这个,只是一个想法...