python实现 mysql 表批量导成oracle建表以及索引语句
mhr18 2024-09-20 20:46 18 浏览 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
相关推荐
- 京东大佬问我,每天新增100w订单数据的分库分表方案
-
京东大佬问我,每天新增100w订单数据的分库分表方案嗯,用户问的是高并发订单系统的分库分表方案,每天新增100万订单。首先,我得理解需求。每天100万订单,那每秒大概是多少呢?算一下,100万除以86...
- MySQL 内存使用构成解析与优化实践
-
在为HULK平台的MySQL提供运维服务过程中,我们常常接到用户反馈:“MySQL内存使用率过高”。尤其在业务高峰期,监控中内存占用持续增长,即便数据库运行正常,仍让人怀疑是否存在异常,甚至...
- 阿里云国际站:怎样计算内存优化型需求?
-
本文由【云老大】TG@yunlaoda360撰写一、内存优化型实例的核心价值内存优化型ECS实例专为数据密集型场景设计,具有以下核心优势:高内存配比:内存与CPU比例可达1:8(如ecs.re6....
- MySQL大数据量处理常用解决方案
-
1、读写分离读写分离,将数据库的读写操作分开,比如让性能比较好的服务器去做写操作,性能一般的服务器做读操作。写入或更新操作频繁可以借助MQ,进行顺序写入或更新。2、分库分表分库分表是最常规有效的一种大...
- 1024程序员节 花了三个小时调试 集合近50种常用小工具 开源项目
-
开篇1024是程序员节了,本来我说看个开源项目花半个小时调试之前看的一个不错的开源项目,一个日常开发常常使用的工具集,结果花了我三个小时,开源作者的开源项目中缺少一些文件,我一个个在网上找的,好多坑...
- 免费全开源,功能强大的多连接数据库管理工具!-DbGate
-
DBGate是一个强大且易于使用的开源数据库管理工具,它提供了一个统一的Web界面,让你能够轻松地访问和管理多种类型的数据库。无论你是开发者、数据分析师还是DBA,DBGate都能帮助你提升工作效率...
- 使用operator部署Prometheus
-
一、介绍Operator是CoreOS公司开发,用于扩展kubernetesAPI或特定应用程序的控制器,它用来创建、配置、管理复杂的有状态应用,例如数据库,监控系统。其中Prometheus-Op...
- java学习总结
-
SpringBoot简介https://spring.io/guideshttp://www.spring4all.com/article/246http://www.spring4all.com/a...
- Swoole难上手?从EasySwoole开始
-
前言有些童鞋感觉对Swoole不从下手,也不知在什么业务上使用它,看它这么火却学不会也是挺让人捉急的一件事情。Swoole:面向生产环境的PHP异步网络通信引擎啥是异步网络通信?10年架构师领你架...
- 一款商用品质的开源商城系统(Yii2+Vue2.0+uniapp)
-
一、项目简介这是一套很成熟的开源商城系统【开店星】,之前推过一次,后台感兴趣的还不少,今天再来详细介绍一下:基于Yii2+Vue2.0+uniapp框架研发,代码质量堪称商用品质,下载安装无门槛,UI...
- Yii2中对Composer的使用
-
如何理解Composer?若使用Composer我们应该先知道这是一个什么东西,主要干什么用的,我们可以把Composer理解为PHP包的管理工具,管理我们用到的Yii2相关的插件。安装Compose...
- SpringBoot实现OA自动化办公管理系统源码+代码讲解+开发文档
-
今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的自动化OA办公管理系统,主要实现了日常办公的考勤签到等一些办公基本操作流程的全部功能,系统分普通员工、部门经理、管理员等...
- 7层架构解密:从UI到基础设施,打造真正可扩展的系统
-
"我们系统用户量暴增后完全崩溃了!"这是多少工程师的噩梦?选择正确的数据库只是冰山一角,真正的系统扩展性是一场全栈战役。客户端层:用户体验的第一道防线当用户点击你的应用时,0.1秒...
- Win11系统下使用Django+Celery异步任务队列以及定时(周期)任务
-
首先明确一点,celery4.1+的官方文档已经详细说明,该版本之后不需要引入依赖django-celery这个库了,直接用celery本身就可以了,就在去年年初的一篇文章python3.7....
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- 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)