【问题标题】:Table not found after apparently successful migration显然成功迁移后找不到表
【发布时间】:2014-01-27 23:36:05
【问题描述】:

我在 CL 中使用 flyway 迁移我的生产数据库 (mySql),而我使用 H2 在单元测试中使用固定 SQL 查询来创建数据库、表等。我现在想在每次单元测试后更好地集成 flyway 和创建/删除数据库。

我有一个数据库工厂,在它的构建方法中我使用了以下代码:

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

你知道我可能做错了什么吗?

【问题讨论】:

    标签: h2 flyway


    【解决方案1】:

    有同样的问题 - 在挖掘之后,似乎 H2 数据库正在迁移脚本之间以某种方式重新创建。

    您可以通过在前两次迁移中添加 SELECT * FROM migrations 来确认这种情况发生 - 它会在第一次成功并在第二次失败。

    根据H2 Documentation,指定数据库名称和;DB_CLOSE_DELAY=-1 选项应该足以允许对内存数据库的并发和后续访问,但情况并非如此。 p>

    将 Flyway 从 3.1 升级到 3.2.1修复该问题。

    【讨论】:

      【解决方案2】:

      问题在于你的 JDBC url。

      MYSERVER 是数据库的名称,而不是架构。

      最简单的做法是让 flyway 使用相同的 url,而不是设置模式。这样您就可以在 MYSERVER 数据库的公共架构中找到所有内容。

      【讨论】:

      • 感谢您的快速回复!如果我理解正确,我应该删除行 flyway.setSchemas("MYSERVER");这似乎没有解决问题:(
      • 但奇怪的是,如果我删除 mem 属性,事情就会开始好转
      • 我很困惑......你说答案没有解决问题,但它被标记为好。现在我遇到了同样的问题......解决方案是什么? ...它是“记忆”?
      • 顺便和相关的(从jkyamog.blogspot.com.es/2012/06/…获取)“......有时我看到h2 url连接为“jdbc:h2:mem”,这与“jdbc:h2:mem”不同:"。前者会在当前路径db中创建一个名为mem的持久化db,后者会在内存中创建一个db。"
      • 通过删除 :mem 部分,您将切换到磁盘上的持久数据库 - 这可以避免此问题。
      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      相关资源
      最近更新 更多