篮之新喜 发表于 2023-8-31 16:05:50

Java将MySQL建表语句转换为SQLite的建表语句

Java将MySQL建表语句转换为SQLite的建表语句

源代码:
package com.fxsen.platform.core.util;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* mysql转SQLite
*@Author: <a target="_blank" href="https://www.cnblogs.com/mailto:fxsen@foxmail.com">Fxsen</a>
*@CreateTime: 2023年08月22日15:46
*/
public class MysqlToSqLiteUtil {

    public static final Map<String, String> FIELD_TYPE_MAP = new HashMap<>();

    static {
      FIELD_TYPE_MAP.put("int", "INTEGER");
      FIELD_TYPE_MAP.put("bigint", "INTEGER");
      FIELD_TYPE_MAP.put("tinyint", "INTEGER");
      FIELD_TYPE_MAP.put("smallint", "INTEGER");
      FIELD_TYPE_MAP.put("mediumint", "INTEGER");
      FIELD_TYPE_MAP.put("float", "REAL");
      FIELD_TYPE_MAP.put("double", "REAL");
      FIELD_TYPE_MAP.put("decimal", "NUMERIC");
      FIELD_TYPE_MAP.put("varchar", "TEXT");
      FIELD_TYPE_MAP.put("char", "TEXT");
      FIELD_TYPE_MAP.put("text", "TEXT");
      FIELD_TYPE_MAP.put("enum", "TEXT");
      FIELD_TYPE_MAP.put("datetime", "TEXT");
      FIELD_TYPE_MAP.put("timestamp", "TEXT");
      FIELD_TYPE_MAP.put("date", "TEXT");
      FIELD_TYPE_MAP.put("time", "TEXT");
      FIELD_TYPE_MAP.put("blob", "BLOB");
      FIELD_TYPE_MAP.put("bit", "TEXT");
      FIELD_TYPE_MAP.put("boolean", "INTEGER");
      FIELD_TYPE_MAP.put("set", "TEXT");
      FIELD_TYPE_MAP.put("json", "TEXT");
      FIELD_TYPE_MAP.put("geometry", "BLOB");
      FIELD_TYPE_MAP.put("point", "BLOB");
      FIELD_TYPE_MAP.put("linestring", "BLOB");
      FIELD_TYPE_MAP.put("polygon", "BLOB");
      FIELD_TYPE_MAP.put("multipoint", "BLOB");
      FIELD_TYPE_MAP.put("multilinestring", "BLOB");
      FIELD_TYPE_MAP.put("multipolygon", "BLOB");
      FIELD_TYPE_MAP.put("geometrycollection", "BLOB");
    }

    public static void main(String[] args) {
      String createTableStatement = "CREATE TABLE `t_enterprise_info` (\n" +
                "`id` varchar(32) NOT NULL COMMENT '主键ID',\n" +
                "`category_id` text COMMENT '企业类别ID',\n" +
                "`name` varchar(255) DEFAULT NULL COMMENT '企业名称',\n" +
                "`social_credit_code` varchar(255) DEFAULT NULL COMMENT '社会信用代码',\n" +
                "`org_code` varchar(255) DEFAULT NULL COMMENT '组织机构代码',\n" +
                "`address` varchar(255) DEFAULT NULL COMMENT '街(村)、门牌号(实际经营地)',\n" +
                "`register_address` varchar(255) DEFAULT NULL COMMENT '单位注册地',\n" +
                "`legal_person` varchar(255) DEFAULT NULL COMMENT '单位法人',\n" +
                "`open_date` varchar(50) DEFAULT NULL COMMENT '开业时间',\n" +
                "PRIMARY KEY (`id`) USING BTREE\n" +
                ") ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='企业基本信息表';";
      System.out.println(convertMysqlToSQLite(createTableStatement));
    }

    public static String convertMysqlToSQLite(String mysqlStatement) {

      // 删除COMMENT
      String reg = "COMMENT\\s*'.*?'";
      Pattern pattern = Pattern.compile(reg);
      Matcher matcher = pattern.matcher(mysqlStatement);
      String result = matcher.replaceAll("")
                .replaceAll("\\).*?;", ");")
                .replaceAll("USING BTREE","")
                .replaceAll("`","\"");
      // 替换 MySQL 建表语句中的数据类型和关键字为 SQLite 的等价语句
      for (String key : FIELD_TYPE_MAP.keySet()) {
            // 生成正则表达式,匹配字段类型
            String regex = "\\b" + key + "\\b";
            Pattern pattern2 = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
            Matcher matcher2 = pattern2.matcher(result);

            // 执行替换
            result = matcher2.replaceAll(FIELD_TYPE_MAP.get(key));
      }

      // 返回替换后的 SQLite 建表语句
      return result;
    }转换前:
CREATE TABLE `t_enterprise_info` (
`id` varchar(32) NOT NULL COMMENT '主键ID',
`category_id` text COMMENT '企业类别ID',
`name` varchar(255) DEFAULT NULL COMMENT '企业名称',
`social_credit_code` varchar(255) DEFAULT NULL COMMENT '社会信用代码',
`org_code` varchar(255) DEFAULT NULL COMMENT '组织机构代码',
`address` varchar(255) DEFAULT NULL COMMENT '街(村)、门牌号(实际经营地)',
`register_address` varchar(255) DEFAULT NULL COMMENT '单位注册地',
`legal_person` varchar(255) DEFAULT NULL COMMENT '单位法人',
`open_date` varchar(50) DEFAULT NULL COMMENT '开业时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='企业基本信息表';转换后:
CREATE TABLE "t_enterprise_info" (
"id" TEXT(32) NOT NULL ,
"category_id" TEXT ,
"name" TEXT(255) DEFAULT NULL ,
"social_credit_code" TEXT(255) DEFAULT NULL ,
"org_code" TEXT(255) DEFAULT NULL ,
"address" TEXT(255) DEFAULT NULL ,
"register_address" TEXT(255) DEFAULT NULL ,
"legal_person" TEXT(255) DEFAULT NULL ,
"open_date" TEXT(50) DEFAULT NULL ,
PRIMARY KEY ("id")
);
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Java将MySQL建表语句转换为SQLite的建表语句