轉換MYSQL建表語句轉換H2建表語句工具

前言

前幾個星期, 搭建項目的單元測試配置, 打算使用H2作爲內存數據庫來跑單元測試, 可是項目使用的是MYSQL數據庫, Navicat導出的sql不兼容H2數據庫, 因此須要轉換. 通過了一些常識, 寫了個工具類類轉換.java

準備

  1. 工具不必定能處理全部狀況.
  2. 須要先將MYSQL的建表語句經過Navicat導出, 具體爲, 右鍵數據庫 -> Dump SQL File -> Structure Only 導出僅包含建表語句的SQL文件.
  3. 運行下面代碼.
import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.common.base.Charsets;
import com.google.common.io.Files;

/**
 * 轉換navicat導出的mysql的建表語句爲h2的語法
 * 
 * 主要的要注意的點是:
 * 
 * 1.設置H2爲mysql模式, 能夠經過 SET MODE MYSQL;語句來實現
 * 
 * 2.'`'所有要去掉
 * 
 * 3.字段的字符集設置'COLLATE utf8_bin'不支持, 須要刪除, 如這樣的'`operator` varchar(10) COLLATE utf8_bin NOT NULL'
 * 
 * 4.註釋按道理也沒問題的, 可是沒有用, 因此刪除了.
 * 
 * 5.'ENGINE=InnoDB'設置不支持, 刪掉
 * 
 * 6.'DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'不支持, 修改成H2相似的'AS CURRENT_TIMESTAMP'
 * 
 * 7.H2的索引名必需要全局惟一, 因此須要替換全部的索引名爲全局惟一
 * 
 * @author tudesheng
 * @since 2016年6月20日 下午8:37:52
 *
 */
public class TransformMysqlToH2 {

    public static void main(String[] args) throws Exception {
        File file = new File("C:\\Users\\haogrgr\\Desktop\\你的sql文件");
        String content = Files.toString(file, Charsets.UTF_8);

        content = "SET MODE MYSQL;\n\n" + content;

        content = content.replaceAll("`", "");
        content = content.replaceAll("COLLATE.*(?=D)", "");
        content = content.replaceAll("COMMENT.*'(?=,)", "");
        content = content.replaceAll("\\).*ENGINE.*(?=;)", ")");
        content = content.replaceAll("DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", " AS CURRENT_TIMESTAMP");

        content = uniqueKey(content);

        System.out.println(content);
    }

    /**
     * h2的索引名必須全局惟一
     * 
     * @param content sql建表腳本
     * @return 替換索引名爲全局惟一
     */
    private static String uniqueKey(String content) {
        int inc = 0;
        Pattern pattern = Pattern.compile("(?<=KEY )(.*?)(?= \\()");
        Matcher matcher = pattern.matcher(content);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group() + inc++);
        }
        matcher.appendTail(sb);
        content = sb.toString();
        return content;
    }

}

最後

代碼比較簡單, 註釋裏面有說明, 不必定能處理全部狀況, 可是我這裏是能夠了.mysql

相關文章
相關標籤/搜索