3

インメモリH2データベースを使用して、いくつかのユニット/統合テストをセットアップしようとしています。すべてがSpringに接続されています。これは、開発および本番環境でMySQLを使用する既存のアプリ用です。

ここで、H2でデータベース構造を作成するためのDDLSQLスクリプトが必要です。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 に答える