mysql转达梦的python脚本

mysql_ddl:

sql 复制代码
CREATE TABLE `ops_app_import` (
  `id` char(32) NOT NULL COMMENT '主键ID',
  `pkg_name` varchar(255) NOT NULL DEFAULT '' COMMENT '导入包名称',
  `pkg_md5` varchar(32) NOT NULL COMMENT '导入包md5值',
  `backup_pkg_name` varchar(255) DEFAULT '' COMMENT '备份包名称',
  `backup_pkg_md5` varchar(32) DEFAULT '' COMMENT '备份包md5值',
  `process_status` varchar(32) DEFAULT '' COMMENT '处理状态',
  `comment` varchar(255) NOT NULL DEFAULT '' COMMENT '描述',
  `creator_id` char(32) DEFAULT '0' COMMENT '创建者ID',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='应用导入包';

dameng_ddl:

sql 复制代码
CREATE TABLE "ops_app_import" (
  "id" char(32) NOT NULL COMMENT '主键ID',
  "pkg_name" varchar(255) NOT NULL DEFAULT '' COMMENT '导入包名称',
  "pkg_md5" varchar(32) NOT NULL COMMENT '导入包md5值',
  "backup_pkg_name" varchar(255) DEFAULT '' COMMENT '备份包名称',
  "backup_pkg_md5" varchar(32) DEFAULT '' COMMENT '备份包md5值',
  "process_status" varchar(32) DEFAULT '' COMMENT '处理状态',
  "comment" varchar(255) NOT NULL DEFAULT '' COMMENT '描述',
  "creator_id" char(32) DEFAULT '0' COMMENT '创建者ID',
  "gmt_create" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  "gmt_modified" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '修改时间',
  PRIMARY KEY ("id")
);

脚本:

python 复制代码
index_sql_list = []


def replaceKey(line, currTable):
    indexColumnStart = line.index("(")
    indexColumnEnd = line.index(")")
    if (line.lstrip().upper().startswith("KEY")):
        indexSql = f"CREATE INDEX {line.lstrip()[4: indexColumnStart - 2]} ON {currTable}({line[indexColumnStart + 1: indexColumnEnd]});"
    else:
        indexSql = f"CREATE UNIQUE INDEX {line.lstrip()[11: indexColumnStart - 2]} ON {currTable}({line[indexColumnStart + 1: indexColumnEnd]});"
    index_sql_list.append(indexSql)


def getTable(line):
    indexCreate = 0
    if line.startswith("CREATE TABLE IF NOT EXISTS"):
        indexCreate = len("CREATE TABLE IF NOT EXISTS")
    elif line.startswith("CREATE TABLE"):
        indexCreate = len("CREATE TABLE")
    indexEnd = line.index("(")
    return line[indexCreate:indexEnd].rstrip("(").strip()


if __name__ == "__main__":
    result = []
    currTable = ''
    with open('mysql_ddl.sql', 'r') as file:
        line = file.readline()
        while line:
            # 替换`x`为"x"
            line = line.replace("`", "\"").replace("\n", "").replace("unsigned", "")
            # longtext替换
            line = line.replace("longtext", "text").replace("LONGTEXT", "TEXT")
            # mediumblob 替换
            line = line.replace("mediumblob", "blob").replace("MEDIUMBLOB", "BLOB")
            lTrimUpperLine = line.lstrip().upper()
            # 替换DEFAULT CURRENT_TIMESTAMP ON UPDATE
            if lTrimUpperLine.count("DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") > 0:
                line = line.replace("ON UPDATE CURRENT_TIMESTAMP", "") \
                    .replace("on UPDATE CURRENT_TIMESTAMP", "") \
                    .replace("on update CURRENT_TIMESTAMP", "") \
                    .replace("ON update CURRENT_TIMESTAMP", "")
            # 替换ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT
            if lTrimUpperLine.count(") ENGINE=INNODB") > 0:
                line = ");"
            # 查询当前所属表
            if lTrimUpperLine.startswith("CREATE TABLE "):
                currTable = getTable(line)
            # 移除bigint、int、tinyint的显示占位符
            if line.count(" bigint(") > 0:
                indexBigint = line.find("bigint(")
                right = line[indexBigint + 6:]
                right = right[right.find(")") + 1:]
                line = line[:indexBigint + 6] + right
            if line.count(" int(") > 0:
                indexBigint = line.find("int(")
                right = line[indexBigint + 3:]
                right = right[right.find(")") + 1:]
                line = line[:indexBigint + 3] + right
            if line.count(" tinyint(") > 0:
                indexBigint = line.find("tinyint(")
                right = line[indexBigint + 7:]
                right = right[right.find(")") + 1:]
                line = line[:indexBigint + 7] + right
            # 唯一索引替换
            if lTrimUpperLine.startswith("UNIQUE "):
                column = line[line.index("("):line.index(")") + 1]
                line = f"UNIQUE {column},"
            # 记录索引
            if lTrimUpperLine.startswith("KEY "):
                replaceKey(line, currTable)
            # 检测到结尾,移除上一行最后一个逗号
            elif line.count(");") > 0:
                lastLine = result[-1:][0]
                if lastLine.rstrip().endswith(","):
                    lastLine = lastLine.rstrip(",")
                    result.pop()
                    result.append(lastLine)
                result.append(line)
            elif (lTrimUpperLine.strip() is None
                  or len(lTrimUpperLine.strip()) == 0
                  or lTrimUpperLine.startswith("/*")
                  or lTrimUpperLine.startswith("LOCK TABLES")
                  or lTrimUpperLine.startswith("UNLOCK TABLES;")
                  or lTrimUpperLine.startswith("--")
                  or lTrimUpperLine.strip() is None):
                pass
            else:
                result.append(line)
            line = file.readline()
    for x in index_sql_list:
        result.append(x)
    with open("dameng_ddl.sql", "w") as f:
        for r in result:
            f.writelines(r + "\n")

如果想直接转化为大写,则不用加""

python 复制代码
index_sql_list = []


def replaceKey(line, currTable):
    indexColumnStart = line.index("(")
    indexColumnEnd = line.index(")")
    if (line.lstrip().upper().startswith("KEY")):
        indexSql = f"CREATE INDEX {line.lstrip()[4: indexColumnStart - 2]} ON {currTable}({line[indexColumnStart + 1: indexColumnEnd]});"
    else:
        indexSql = f"CREATE UNIQUE INDEX {line.lstrip()[11: indexColumnStart - 2]} ON {currTable}({line[indexColumnStart + 1: indexColumnEnd]});"
    index_sql_list.append(indexSql)


def getTable(line):
    indexCreate = 0
    if line.startswith("CREATE TABLE IF NOT EXISTS"):
        indexCreate = len("CREATE TABLE IF NOT EXISTS")
    elif line.startswith("CREATE TABLE"):
        indexCreate = len("CREATE TABLE")
    indexEnd = line.index("(")
    return line[indexCreate:indexEnd].rstrip("(").strip()


if __name__ == "__main__":
    result = []
    currTable = ''
    with open('mysql_ddl.sql', 'r') as file:
        line = file.readline()
        while line:
            line = line.replace("\n", "")
            lTrimUpperLine = line.lstrip().upper()
            if lTrimUpperLine.startswith("COMMENT") or lTrimUpperLine.startswith("`COMMENT`"):
                # 替换`x`为"x"
                line = line.replace("`", "\"")
            else:
                # 移除``
                line = line.replace("`", "")
            # unsigned 替换
            line = line.replace("unsigned", "").replace("UNSIGNED", "")
            # longtext替换
            line = line.replace("longtext", "text").replace("LONGTEXT", "TEXT")
            # mediumblob 替换
            line = line.replace("mediumblob", "blob").replace("MEDIUMBLOB", "BLOB")
            # 替换DEFAULT CURRENT_TIMESTAMP ON UPDATE
            if lTrimUpperLine.count("DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") > 0:
                line = line.replace("ON UPDATE CURRENT_TIMESTAMP", "") \
                    .replace("on UPDATE CURRENT_TIMESTAMP", "") \
                    .replace("on update CURRENT_TIMESTAMP", "") \
                    .replace("ON update CURRENT_TIMESTAMP", "")
            # 替换ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT
            if lTrimUpperLine.count(") ENGINE=INNODB") > 0:
                line = ");"
            # 查询当前所属表
            if lTrimUpperLine.startswith("CREATE TABLE "):
                currTable = getTable(line)
            # 移除bigint、int、tinyint的显示占位符
            if line.count(" bigint(") > 0:
                indexBigint = line.find("bigint(")
                right = line[indexBigint + 6:]
                right = right[right.find(")") + 1:]
                line = line[:indexBigint + 6] + right
            if line.count(" int(") > 0:
                indexBigint = line.find("int(")
                right = line[indexBigint + 3:]
                right = right[right.find(")") + 1:]
                line = line[:indexBigint + 3] + right
            if line.count(" tinyint(") > 0:
                indexBigint = line.find("tinyint(")
                right = line[indexBigint + 7:]
                right = right[right.find(")") + 1:]
                line = line[:indexBigint + 7] + right
            # 唯一索引替换
            if lTrimUpperLine.startswith("UNIQUE "):
                column = line[line.index("("):line.index(")") + 1]
                line = f"UNIQUE {column},"
            # 记录索引
            if lTrimUpperLine.startswith("KEY "):
                replaceKey(line, currTable)
            # 检测到结尾,移除上一行最后一个逗号
            elif line.count(");") > 0:
                lastLine = result[-1:][0]
                if lastLine.rstrip().endswith(","):
                    lastLine = lastLine.rstrip(",")
                    result.pop()
                    result.append(lastLine)
                result.append(line)
            elif (lTrimUpperLine.strip() is None
                  or len(lTrimUpperLine.strip()) == 0
                  or lTrimUpperLine.startswith("/*")
                  or lTrimUpperLine.startswith("LOCK TABLES")
                  or lTrimUpperLine.startswith("UNLOCK TABLES;")
                  or lTrimUpperLine.startswith("--")
                  or lTrimUpperLine.strip() is None):
                pass
            else:
                result.append(line)
            line = file.readline()
    for x in index_sql_list:
        result.append(x)
    with open("dameng_ddl.sql", "w") as f:
        for r in result:
            f.writelines(r + "\n")
相关推荐
倔强的石头106几秒前
关键信息基础设施的数据库选型:高可用、全链路安全与平滑替代的技术实践
数据库·安全·金仓数据库
追风少年ii12 分钟前
多组学扩展---分子对接pyrosetta
python·数据分析·空间·单细胞
人道领域23 分钟前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
煎蛋学姐28 分钟前
SSM音乐播放软件的开发与实现7g5j0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 开发·前后端开发
2301_8213696131 分钟前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python
星空露珠34 分钟前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
m0_5613596735 分钟前
使用Kivy开发跨平台的移动应用
jvm·数据库·python
sheji526144 分钟前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
海域云-罗鹏1 小时前
国内公司与英国总部数据中心/ERP系统互连,SD-WAN专线实操指南
大数据·数据库·人工智能
编程火箭车1 小时前
04.第一个 Python 程序:Hello World 从编写到运行全解析
python·python第一个程序·python入门报错解决·python新手教程·hello world 程序·python终端运行·pycharm运行代码