我正在尝试使用内存中的 H2 数据库设置一些单元/集成测试,整个过程都与 Spring 连接起来。这适用于将 MySQL 用于开发和生产的现有应用程序。
现在,我需要一个 DDL SQL 脚本来在 H2 中创建我的数据库结构。我可以轻松地从 MySQL 导出 DDL 语句。但我不知道语法上的区别是什么——至少我很确定诸如engine=InnoDB
必须去之类的东西。
还有其他我应该注意的语法差异吗?
是否有可以自动将 de DDL 语句从 MySQL 语法转换为 H2 语法的工具?
对于最近的一个项目,我对此进行了快速尝试,但这绝对不应该被视为最佳或最干净的解决方案。还应该注意的是,我纯粹将它用于基于单元的集成测试。理想情况下,我会在接下来的几周内将它放在 github 上,以便人们可以添加它,但同时它可能会有所帮助。Java中的解决方案:
/**
* Designed to go through MySQL schema produced from forward engineering tools and normalize slightly to
* work with H2 for testing. This only works on the SQL constructs themselves and is not able to
* detect errors such as constraints with the same name.
*
* Assumptions
* - INDEX is created separately from main SQL body
* - Incompatible key words such as order are not used
* - Assumes the name of a constraint is not duplicated
* @author jpgough
*
*/
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class MySqlToH2 {
public static String convert(String filePath) throws IOException {
String[] rawSQL = new String(Files.readAllBytes(Paths.get(filePath))).split("\\n");
StringBuilder builder = new StringBuilder();
for(String line : rawSQL) {
if(line.contains("SET")) {
continue;
} else if(line.contains("INDEX")) {
continue;
} else if(line.contains("IF NOT EXISTS")) {
line = line.replaceAll("IF NOT EXISTS", "");
} else if(line.contains("--")) {
continue;
} else if(line.contains("ENGINE")) {
line = ";";
}
line = line.replace("`", "");
builder.append(line).append("\n");
}
return builder.toString();
}
}