如何使用 H2 测试 MySQL 大小写敏感度

Jas*_*itt 1 mysql scala h2 playframework-2.0

我正在开发一个使用 mysql 的 Scala/Play 应用程序。我遇到了一个问题,即我的应用程序在部署到集成环境时中断,因为我的应用程序中的 sql 查询的表和别名大小写错误。我在开发过程中没有发现这一点,因为我使用的是 Mac,MySQL 默认情况下不区分大小写。除了将本地环境配置为区分大小写之外,我还希望在编写大小写错误的查询时单元测试失败。我正在使用 H2 测试数据库,如Play 文档中所述。我使用以下代码设置数据库,其中模式是具有创建脚本的字符串:

def apply[T](block: Database => T):Unit = {
  Databases.withInMemory(
     urlOptions = Map(
       "MODE" -> "MYSQL"
     ),
     config = Map(
       "logStatements" -> false
     )
   ){
  database =>
    Evolutions.withEvolutions(database, SimpleEvolutionsReader.forDefault(
      Evolution(
        1,
        schema,
        ""
      )
    )){
      block(database)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

直观上,配置映射会有一个类似的选项"caseSensitive" -> true或类似的东西,但我无法找到所有选项的文档。有人知道 H2 是否有这方面的配置选项以及它是什么?

mar*_*ira 5

H2 文档和 Play 文档都解释了这一点(基本上引用了 H2 文档):

在 MySQL 中,文本列默认不区分大小写,而在 H2 中,文本列区分大小写。然而,H2 也支持不区分大小写的列。要创建包含不区分大小写文本的表,请附加IGNORECASE=TRUE到数据库 URL(例如:jdbc:h2:~/test;IGNORECASE=TRUE)。

来自Play 文档

MySQL 中的文本比较默认不区分大小写,而在 H2 中则区分大小写(与大多数其他数据库一样)。H2确实支持不区分大小写的文本比较,但需要单独设置,使用SET IGNORECASE TRUE. 这会影响使用=, LIKE,的比较REGEXP

因此,您需要更改urlOptions要考虑的IGNORECASE参数:

def apply[T](block: Database => T): Unit = {
  Databases.withInMemory(
    urlOptions = Map(
      "MODE" -> "MYSQL",
      "IGNORECASE" -> "TRUE"
    ),
    config = Map(
      "logStatements" -> false
    )
  ) {
    database =>
      Evolutions.withEvolutions(database, SimpleEvolutionsReader.forDefault(
        Evolution(
          1,
          schema,
          ""
        )
      )) {
        block(database)
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我建议不要在运行集成测试时使用不同的数据库引擎。尝试使用与生产中使用的数据库相同的数据库,因为这会让您的测试更有信心。