3

我正在尝试使用内存中的 H2 数据库设置一些单元/集成测试,整个过程都与 Spring 连接起来。这适用于将 MySQL 用于开发和生产的现有应用程序。

现在,我需要一个 DDL SQL 脚本来在 H2 中创建我的数据库结构。我可以轻松地从 MySQL 导出 DDL 语句。但我不知道语法上的区别是什么——至少我很确定诸如engine=InnoDB必须去之类的东西。

还有其他我应该注意的语法差异吗?

是否有可以自动将 de DDL 语句从 MySQL 语法转换为 H2 语法的工具?

4

1 回答 1

0

对于最近的一个项目,我对此进行了快速尝试,但这绝对不应该被视为最佳或最干净的解决方案。还应该注意的是,我纯粹将它用于基于单元的集成测试。理想情况下,我会在接下来的几周内将它放在 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();
    }
}
于 2013-04-11T13:09:16.427 回答