我正在从事一个使用不同 MySQL 模式进行客户管理的项目,例如每个客户都有自己的数据库架构,该架构是使用骨架模板创建的。
对于兼容性问题,我必须从 Java 创建新的 MySQL 模式,这在以前是用 PHP 完成的。我创建了一个小型服务类,它通过重复使用 CREATE TABLE 'a' LIKE 'b';
在 MySQL 数据库上完美运行,但是这不适用于 H2db,因为 H2 不支持 >LIKE
- 创建表时的部分。然后我创建了一个 MySQL 并修改了文件以便用 Java 轻松处理(Files.readAllLines
,它被馈送到 Statement.executeBatch
)。但是,由于像 COLLATION=UTF8
这样的语句,此转储在 H2db 上也会失败。遗憾的是,拥有这些很重要,因为我们经常有需要正确编码的特殊字符,所以不建议简单地从 sql 文件中删除所述语句。
我像这样初始化数据源:
public DataSource dataSource(ResourceLoader resourceLoader) {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.setScriptEncoding("UTF-8")
.addScript("data.sql").build();
}
所以,我的配置可能性很少。我们使用 gradle
来构建我们的应用程序,因此建议的 maven
-plugin 也无济于事 - 至少我还没有发现如何将它与 gradle 一起使用
,如果可能的话。
所以我的问题是,我需要检查服务是否真的正确保存了数据,但我无法在内存中执行此操作,因为 H2 不支持该语法,而且我不允许使用“真实的”MySQL 数据库,因为我们所有的测试都必须脱离“真实的”连接,并且如有必要,只能使用内存中的数据库存储。
最佳答案
我最终使用了 https://github.com/vorburger/MariaDB4j作为嵌入式数据库,因为我们无论如何都使用 MariaDB,所以这肯定会消除所有方言问题。由于这与嵌入式 MongoDB 的工作方式相同,因此额外的测试成本是可以接受的。
但要注意:这需要 64 位操作系统才能工作。
关于mysql - Spring 中在 H2 数据库上集成测试 MySQL 语法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40288127/