【发布时间】:2017-09-25 09:39:36
【问题描述】:
我的应用程序中的数据库方案由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 迁移不变。其他可能的解决方案是什么?
【问题讨论】:
-
我怕一个庞大的MS SQL Server和一个小的嵌入式数据库不能100%兼容。在可能的情况下,H2 支持 ANSI SQL 标准,并尝试与其他数据库兼容。不过还是有区别的。 (source)
标签: java sql-server spring h2 flyway