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 href="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")
);

Java将MySQL建表语句转换为SQLite的建表语句的更多相关文章

  1. python:sql建表语句转换为json

    第一种sql格式: CREATE TABLE prpcitem_car ( proposalno ) NOT NULL, itemno ,) NOT NULL, riskcode ) NOT NULL ...

  2. 三种常用的MySQL建表语句(转)

    MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1(    ...

  3. MySQL建表语句生成Golang代码

    1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码.基础的增删改查代码(基础的增删改查服务可以划入DAO(Data Access ...

  4. ORACLE 建表语句(表名及字段名大写)

    ORACLE建表时如果表名或者字段名存在大小写同时存在的情况下,默认为区分大小写,此时在select/updata等操作时需要在表名或者字段名上添加双引号,否则会报"视图不存在"的 ...

  5. mysql和oracle建表语句以及数据类型的区别

    1.mysql和oracle建表语句的区别 mysql DROP TABLE IF EXISTS `order`;CREATE TABLE `order` (  `id` int(11) NOT NU ...

  6. sqlite建表语句(特别是外键问题)

    原创  sqlite建表语句(特别是外键问题) 下面图表示两个表关系: //表1User_invitecreate table User_invite(Invite_id INTEGER PRIMAR ...

  7. Python导出MySQL数据库中表的建表语句到文件

    为了做数据对象的版本控制,需要将MySQL数据库中的表结构导出成文件进行版本化管理,试写了一下,可以完整导出数据库中的表结构信息 # -*- coding: utf-8 -*- import os i ...

  8. MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称

    MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称   INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...

  9. 借助python工具从word文件中抽取相关表的定义,最后组装建表语句-非常好

    借助python工具从word文件中抽取表的定义,最后组装建表语句-非常好 --如有转载请以超链接的方式注明原文章出处,谢谢大家.请尊重每一位乐于分享的原创者 1.python脚本 ## -*- co ...

  10. sqlserver 建表语句,获取建表语句的存储过程,包括排序规则,索引,字段说明,支持同时生成多个表

    先创建一个分割表名的分割函数 --表值函数用以截取字符串 --如果为其添加一列主键id,则其顺序就会固定了 create FUNCTION [Split](@text NVARCHAR(max)) ) ...

随机推荐

  1. 2022-01-16:小明手中有n块积木,并且小明知道每块积木的重量。现在小明希望将这些积木堆起来, 要求是任意一块积木如果想堆在另一块积木上面,那么要求: 1.上面的积木重量不能小于下面的积木重量;

    2022-01-16:小明手中有n块积木,并且小明知道每块积木的重量.现在小明希望将这些积木堆起来, 要求是任意一块积木如果想堆在另一块积木上面,那么要求: 1.上面的积木重量不能小于下面的积木重量: ...

  2. 2021-10-24:快乐数。编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是

    2021-10-24:快乐数.编写一个算法来判断一个数 n 是不是快乐数.「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和.然后重复这个过程直到这个数变为 1,也可能是 ...

  3. JavaWeb概念

    1 基本概念 1.1 前言 web开发: web,网页的意思,类如:www.baidu.com 静态web: html,css 提供给所有人看到的数据始终不会改变! 动态web: 几乎所有的网站:类如 ...

  4. 【CF】掉分总结

    比赛总结 前情提要 自从前段时间连续掉分,就心态崩了,还是自己太菜,一直想写个总结,看看这几场比赛都干了啥,以后准备怎么办.鸽了这么久的总结,是该写写了. 这是正文 首先大致提一下情感曲线(菜的真实) ...

  5. GaussDB(DWS)迁移实践丨row_number输出结果不一致

    摘要:迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致. 本文分享自华为云社区<GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一 ...

  6. odoo部署安全性问题

    本文档描述在生产中或在面向Internet的服务器上设置Odoo的基本步骤.它是在安装之后进行的,对于没有在internet上公开的开发系统来说,它通常不是必需的.警告如果您正在设置公共服务器,请务必 ...

  7. 远程挂载 NFS 共享目录引发死机问题

    集群的存储空间有限,把一些历史的归档数据放在了公司的另外一台老旧存储服务器上,并使用 NFS 把它挂载到了 log 节点.周末的时候机房空调故障,旧存储服务器挂掉了!周一上班,在集群登陆节点使用df ...

  8. 【Python&GIS】通过经纬度创建矢量点文件

         最近在做项目时,需要判断某个点是否在感兴趣区内.所以需要使用Python先根据经纬度的点创建矢量文件,再通过点文件和面文件的位置关系判断点是否在面内.         这里我们使用osgeo ...

  9. opencv图像显示问题

    opencv 的图像类型都是numpy array.dtype = uint8. 如果是默认的python的int类型的numpy array,即使每个整数都在范围0-255, 图像也不会显示,必须转 ...

  10. 如何吃透一个Java项目?

    现在Austin的文档我觉得还是比较全的,但到了看代码的时候,可能有的同学就不知道应该怎么看,有想知道模块之间的调用链路,有想一点一点把细节给全看了.这时候就很可能在项目里犯迷糊了,绕不出不来了. J ...