当前位置: 首页 > news >正文

mysql转达梦的python脚本

mysql_ddl:

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:

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

脚本:

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 = 0if 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 UPDATEif 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 COMMENTif 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] + rightif line.count(" int(") > 0:indexBigint = line.find("int(")right = line[indexBigint + 3:]right = right[right.find(")") + 1:]line = line[:indexBigint + 3] + rightif 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 Noneor len(lTrimUpperLine.strip()) == 0or lTrimUpperLine.startswith("/*")or lTrimUpperLine.startswith("LOCK TABLES")or lTrimUpperLine.startswith("UNLOCK TABLES;")or lTrimUpperLine.startswith("--")or lTrimUpperLine.strip() is None):passelse: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")

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

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 = 0if 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 UPDATEif 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 COMMENTif 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] + rightif line.count(" int(") > 0:indexBigint = line.find("int(")right = line[indexBigint + 3:]right = right[right.find(")") + 1:]line = line[:indexBigint + 3] + rightif 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 Noneor len(lTrimUpperLine.strip()) == 0or lTrimUpperLine.startswith("/*")or lTrimUpperLine.startswith("LOCK TABLES")or lTrimUpperLine.startswith("UNLOCK TABLES;")or lTrimUpperLine.startswith("--")or lTrimUpperLine.strip() is None):passelse: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")

相关文章:

  • vulhub中GitLab 远程命令执行漏洞复现(CVE-2021-22205)
  • Flink:使用 Faker 和 DataGen 生成测试数据
  • 【STL】stack栈容器与list链表容器
  • 剑指offer力扣题集
  • 芯片与针灸
  • 【微服务】分布式调度框架PowerJob使用详解
  • C语言字符函数和字符串函数详解
  • FDU 2018 | 1. 求众数
  • Flask学习(四):路由转换器
  • SQL server服务连接失败,通过端口1433连接到主机 localhost的 TCP/IP 连接失败
  • 计算机设计大赛 题目: 基于深度学习的疲劳驾驶检测 深度学习
  • Python和R的区别是什么,Python与R的应用场景是什么?
  • 首页效果炫酷的wordpress免费主题模板
  • 【leetcode】二叉树的前序遍历➕中序遍历➕后序遍历
  • 静态网络配置
  • 自己简单写的 事件订阅机制
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Codepen 每日精选(2018-3-25)
  • Java到底能干嘛?
  • JS专题之继承
  • leetcode98. Validate Binary Search Tree
  • Linux各目录及每个目录的详细介绍
  • Node 版本管理
  • Python学习笔记 字符串拼接
  • Vue组件定义
  • webpack入门学习手记(二)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 服务器之间,相同帐号,实现免密钥登录
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 简单数学运算程序(不定期更新)
  • AI算硅基生命吗,为什么?
  • #1015 : KMP算法
  • #DBA杂记1
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (06)Hive——正则表达式
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Java)【深基9.例1】选举学生会
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (层次遍历)104. 二叉树的最大深度
  • (第一天)包装对象、作用域、创建对象
  • (二)JAVA使用POI操作excel
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (六)软件测试分工
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Android学习笔记 --- android任务栈和启动模式
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net wcf memory gates checking failed
  • .Net Web窗口页属性
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET成年了,然后呢?
  • .NET程序员迈向卓越的必由之路
  • :O)修改linux硬件时间
  • @ConditionalOnProperty注解使用说明