我正在开发一个使用mysql的Scala / Play应用程序。我遇到了一个问题,我的应用程序在部署到我们的集成环境时会中断,因为来自我的应用程序的sql查询对于表和别名都有错误。我没有在开发过程中发现这一点,因为我在Mac上默认情况下MySQL不区分大小写。除了将我的本地环境配置为区分大小写之外,我还希望在编写包含大小写错误的查询时单元测试失败。我正在使用H2测试数据库,如Play documentation所述。我使用以下代码设置数据库,其中 schema 是一个包含创建脚本的字符串:
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)
}
}
}
直观地,配置映射会有像"caseSensitive" -> true
之类的选项或类似的选项,但我一直无法找到所有选项的文档。有人知道H2是否有配置选项以及它是什么?
答案 0 :(得分:3)
H2 docs和Play文档(基本上引用H2文档)解释了这一点:
在MySQL文本列中,默认情况下不区分大小写,而在H2中,它们区分大小写。但是,H2也支持不区分大小写的列。要使用不区分大小写的文本创建表,请将
IGNORECASE=TRUE
附加到数据库URL(例如:jdbc:h2:~/test;IGNORECASE=TRUE
)。
来自Play docs:
默认情况下,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)
}
}
}
但是,我建议在运行集成测试时不要使用不同的数据库引擎。尝试使用生产中使用的相同数据库,因为它会让您的测试更有信心。