python实现 mysql 表批量导成oracle建表以及索引语句
mhr18 2024-09-20 20:46 25 浏览 0 评论
当我们需要进行异构数据库迁移时,对于建表语句就有点头疼了,mysql迁移到oracle,我们可以通过导出mysql 建表语句后,使用powerdesigner来进行mysql DDL语句到ORACLE的转换,但步骤麻烦不说,mysql常用的navicat批量导出表结构不是很友好,pd的转换也有些不可控。下面我们通过python脚本来进行导出转换。
- 首先我们需要安装操作mysql的模块 MySQLdb,可自行搜索 MySQL_python-1.2.5-cp27-none-win_amd64 来安装
以下是脚本内容,只需将 db1或者db2 替换成自己的数据库信息,然后配置sc的值指向 db1,或者db2 运行脚本即可
# -*- coding: UTF-8 -*-
import re
import MySQLdb
import datetime
def create_table(mysql_result,tablename):
colline=""
pk=""
count=0
print "CREATE TABLE "+tablename.upper()+" ("
fileobj.write("CREATE TABLE "+tablename.upper()+" (\n")
for onecol in mysql_result:
colname=onecol[0]
if colname.upper() == "DESC" or colname.upper() == "COMMENT" or colname.upper() =="LEVEL" \
or colname.upper() =="ID" :#or colname.upper() =="REMARK":
colname='"'+colname+'"'
#int
if onecol[1]=="bigint":
colline= colname+ " number(20,0),"
elif onecol[1]=="int":
colline= colname+ " number(10,0),"
elif onecol[1]=="mediumint":
colline= colname+ " number(7,0),"
elif onecol[1]=="smallint":
colline= colname+ " number(5,0),"
elif onecol[1]=="tinyint":
colline= colname+ " number(3,0),"
elif onecol[1]=="decimal" or onecol[1]=="numeric" or onecol[1]=="float":
a=onecol[3]
b=onecol[4]
if a >= 38:
a=38
if b >= 5:
b = 5
colline= colname+ " number("+str(a)+","+str(b)+"),"
#date
elif onecol[1]=="date" or onecol[1]=="datetime" or onecol[1]=="time":
colline= colname+ " date,"
#varchar
elif onecol[1]=="char" or onecol[1]=="varchar" :
if onecol[2]<=4000:
if onecol[2]==0:
colline= colname+ " varchar2(10),"
else:
colline= colname+ " varchar2("+str(onecol[2])+"),"
else:
#colline= colname + " clob,"
colline= colname + " varchar2(4000),"
#text
elif onecol[1]=="text" or onecol[1]=="mediumtext" or onecol[1]=="longtext":
colline= colname+ " clob,"
elif onecol[1]=="tinytext":
colline= colname+ " varchar2(4000),"
#blob
elif onecol[1]=="tinyblob" or onecol[1]=="blob" or onecol[1]=="mediumblob" or onecol[1]=="longblob":
colline= colname+ " blob,"
else:
colline= colname+" "+onecol[1]+","
if onecol[5] == "PRI":
if pk != "":
pk=pk+","+colname
else:
pk=colname
count+=1
if count == len(mysql_result):
if pk != "":
print " ",colline.upper()
print " PRIMARY KEY(",pk.upper(),")"
fileobj.write(" "+colline.upper()+"\n")
fileobj.write(" PRIMARY KEY("+pk.upper()+")\n")
else:
print " ",colline.strip(',').upper()
fileobj.write(" "+colline.strip(',').upper()+"\n")
print ") ;"
fileobj.write(") ;\n")
else:
print " ",colline.upper()
fileobj.write(" "+colline.upper()+"\n")
def test1(ipadd,portnum,dbname,dbuser,dbpassword,tablenamelist):
try:
conn = MySQLdb.connect(host=ipadd,port=portnum,user=dbuser,passwd=dbpassword,db=dbname)
indexcur=conn.cursor()
cur=conn.cursor()
#可以不使用hint,连哪个库时,那个information_schema必然包含了此库的标准库
if len(tablenamelist) == 0:
cur.execute('select /* !HINT({"dn":["'+dbname+'"]})*/ distinct table_name from information_schema.columns where TABLE_SCHEMA="'+dbname+'"')
results=cur.fetchall()
for item in results:
tablenamelist.append(item[0])
for tablename in tablenamelist:
if tablename.upper() == "_SYS_GLOBAL_SEQUENCE_":
continue
cur.execute('select /* !HINT({"dn":["'+dbname+'"]})*/column_name,data_type,character_octet_length,NUMERIC_PRECISION,NUMERIC_SCALE,COLUMN_KEY from information_schema.columns where table_name="'+tablename+'" and TABLE_SCHEMA="'+dbname+'" order by ordinal_position')
results=cur.fetchall()
create_table(results,tablename)
createindex(tablename,indexcur,dbname)
indexcur.close()
cur.close()
conn.close()
except Exception as e:
print 'error:',e
dupInx={}; #distinct from full env (all db in config every time )
def createindex(tablename,indexcur,dbname):
indexcur.execute(' select index_name,table_name, GROUP_CONCAT(column_name) from information_schema.statistics '\
'where table_schema="'+dbname+'" and table_name="'+tablename+'" and index_name != "PRIMARY" group by index_name,table_name order by seq_in_index')
results = indexcur.fetchall()
for item in results:
indexname=item[0]
#if the indexname is exists,then set name string+number
indexname=indexname.upper()
if indexname[0:3] == "IDX":
indexname="IDX_"+dbname.upper()+"_"+indexname[3:]
else:
indexname="IDX_"+dbname.upper()+"_"+indexname
if dupInx.has_key(indexname):
dupInx[indexname] += 1
#print "*****************************************"
indexname=indexname+str(dupInx[indexname])
#print indexname
else:
dupInx[indexname] = 0
cre="CREATE INDEX "+indexname+" ON "+item[1].upper()+"("+item[2].upper()+") ;"
#print cre
fileobjinx.write(cre+"\n")
db1=[
('xxx.xxx.xxx.xxx', 8999, 'cusdb',"user","password",[]),
('xxx.xxx.xxx.xxx', 8998, 'orddb',"user","password",[])
]
db2= [
('127.0.0.1', 3306, 'testdb',"root","m123",[])
]
sc=2
nowTime=datetime.datetime.now().strftime('%Y%m%d%H%M%S')
if sc==1:
for x in db1:
print "\n"
print "---------------shengchan database: ",x[2]," ----------------------"
fileobj=open('E:/createtable/shengchan/'+x[2]+nowTime, 'w')
fileobjinx=open('E:/createtable/shengchan/idx__'+x[2]+nowTime, 'w')
test1(x[0],x[1],x[2],x[3],x[4],x[5])
fileobjinx.close()
fileobj.close()
print "over. script stored in E:/createtable/shengchan/"
elif sc==2:
try:
for x in db2:
print "\n"
print "---------------ceshi database: ",x[2]," ----------------------"
fileobj=open(unicode('E:\从mysql导出oracle建表语句脚本\本机',"utf-8")+x[2]+nowTime, 'w')
fileobjinx=open(unicode('E:\从mysql导出oracle建表语句脚本\本机',"utf-8")+x[2]+nowTime, 'w')
test1(x[0],x[1],x[2],x[3],x[4],x[5])
fileobjinx.close()
fileobj.close()
print "over. script stored in \结算中心化\从mysql导出oracle建表语句脚本"
except Exception as e:
print 'error:',e
相关推荐
- JDK从8升级到21的问题集(jdk8版本)
-
一、背景与挑战1.升级动因oOracle长期支持策略o现代特性需求:协程、模式匹配、ZGC等o安全性与性能的需求oAI新技术引入的版本要求2.项目情况o100+项目并行升级的协同作战o多技术栈并存o持...
- 科莱特SAP ABAP干货 | 基础篇:二、数据字典(1)
-
ABAP开发基础及应用二、数据字典(1)目标及说明目标:1、掌握SAP数据字典各种对象的定义和使用2、能根据业务数据要求,建立存储数据用的表和视图需求说明:1、在SAP中自建程序,以对一企业(自由行集...
- Mycat入门(mycatalog)
-
一、Linux系统下搭建Mycat注:如果没有服务器可以选择虚拟机进行操作1、首先准备好服务器或者虚拟机2、安装和配置MySQL数据库2.1、删除原来的数据库//查询已安装的mariadb[root...
- MySQL从入门到实战:表设计、索引优化与高频面试解析
-
一、业务场景驱动表设计:电商订单系统案例场景背景某电商平台需设计用户、商品、订单模块,要求支持以下操作:用户高频查询最新订单按商品分类+价格区间筛选商品统计每日订单金额建表实战--用户表(反范式设计...
- oracle生成AWR报告的两种方法(oracle中awr报告的输出格式有哪些)
-
方法1:sqlplus中执行:execdbms_workload_repository.create_snapshot();@?/rdbms/admin/awrrpt.sql方法2:setpage...
- Navicat Premium:数据库管理神器(navicat 本地数据库)
-
提供免费下载网站Mavom.cn在数据库管理的世界里,「NavicatPremium」是一款「一体化的数据库管理和迁移工具」,适用于MySQL、SQLServer、Oracle和PostgreSQ...
- Iperius Backup功能特色(backup如何使用)
-
备份作业:1.文件夹备份:本地的文件夹,带SMB的路径文件夹,网络路径文件夹,NAS文件夹等等2.文件备份:对某个文件进行备份3.备份镜像:可以把系统刻录成镜像用于恢复(图1)4.FTP:自带FTP...
- sql注入攻击,拿到网站账户,黑客这样神操作
-
首先的话,我们来仔细搞清楚这个攻击的流程,第一步就是了解一下,什么是sql?又什么是sql注入、sql注入的流程和步骤。1、首先什么是sql,Sql是一种数据库查询和程序设计的语言,这里的数据库是指存...
- Java 8 新特性指南(java的八大特性)
-
本教程可以在实验楼(shiyanlou.com)中在线练习。一、实验简介Java8是近年来最后起来的一个Java编程语言发行版本。Oracle在2014年3月发布了它。该版本为Java带来...
- Java系统开发从入门到精通第三讲(文字版)
-
下来我们进入数据持久化的部分,对于一个真实的业务系统,能够正常的运转离不开数据的持久化。在数据持久化这块,目前主流的还是关系型数据库(RDBMS),NoSQL(NewSQL)也有了长足发展,特别在大数...
- 扣细节:while (true) 和 for (;;) 哪个更快
-
来源:zhihu.com/question/52311366/answer/130090347在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u...
- JAVA 8 环境安装配置(java环境怎么装)
-
一、下载这里选择的是OracleJDK,首先到Oracle官网下载JDK8,以Windows10操作系统为例,若是32位系统则下载“Windowsx86”,否则64位系统下载“Windows...
- 从零开始学Java系列之最详细的Java环境变量配置教程
-
前言:在上一篇文章中,壹哥给大家重点讲解了Java实现跨平台的原理,不知道你现在有没有弄清楚呢?如果你还有疑问,可以在评论区留言~之前的三篇文章,主要是理论性的内容,其实你暂时跳过不看也是可以的,我们...
- Linux下乱码的文件名修改或删除(linux文件名乱码如何处理)
-
查看文件名#lstouch1?.txt#ll-itotal1469445217956913-rw-r--r--1oracleoinstall0Jan18...
- 「论文写作-解决方案」数据库TDE加密
-
数据是应用的核心。对于绝大多数应用,存储数据的数据库是系统日常管理的重中之重。数据库安全背景根据verizon2014年的统计数据,96%数据攻击行为是针对数据库进行的。数据库已经成为外部入侵与内部渗...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)