我正在使用flyway通过CL迁移我的生产数据库(mySql),而我使用固定的SQL查询在我的单元测试中使用H2创建数据库,表等。我现在想在每次单元测试后更好地集成flyway并创建/删除DB。
我有一个DB工厂,在其构建方法中我使用以下代码:
flyway.setLocations("filesystem:sql/migrations/common","filesystem:sql/migrations/h2");
flyway.setSchemas("MYSERVER");
flyway.setDataSource(
p.getProperty(DB_URL.getName()),
p.getProperty(USERNAME.getName()),
p.getProperty(PASSWORD.getName()));
flyway.setInitOnMigrate(true);
flyway.migrate();
迁移似乎正确应用,因为我可以从flyway日志中看到我的SQL代码。但是当我开始使用数据库之后,我立即得到了TABLE NOT FOUND错误。我在内存数据库中使用h2,并使用以下URL初始化我的客户端:
jdbc:h2:mem:MYSERVER;MVCC=true
你对我的错误有什么看法吗?
答案 0 :(得分:2)
遇到同样的问题 - 在挖掘之后,看起来H2数据库正在以某种方式在迁移脚本之间重新创建。
您可以通过在前两次迁移中添加;DB_CLOSE_DELAY=-1
来确认这种情况 - 它将在第一次迁移中成功,在第二次迁移中失败。
根据H2 Documentation,指定数据库名称和3.1
选项应该足以允许对内存数据库的并发和后续访问,然而事实并非如此
将Flyway从3.2.1
升级到{{1}}有修复问题。
答案 1 :(得分:1)
问题是你的JDBC网址。
MYSERVER是数据库的名称,而不是架构。
最简单的方法是让flyway使用相同的url,而不是设置架构。这样,您就可以在MYSERVER数据库的公共模式中找到所有内容。