美创科技技术社区

注册

 

发新话题 回复该主题

python将一个用户下所有的表和数据复制到另一个数据库初步程序 [复制链接]

1#
这段小程序的执行效率想必不会很高,同时对于复制表而言也许create as  select 的语句会来的更加快,但是这段程序的优点在于对于表结构和数据的分离,这样要跨数据库平台复制表提供更加方便的方法,你可以去修改表的创建语句和数据。

python版本2.7+cx_Oracle-5.1.2-11g.win-amd64-py2.7
python代码:


# -*- coding: UTF-8 -*-

import cx_Oracle

from pprint import pprint

#这两行是让cx_Oracle显示或者操作数据时可以对中文支持

import os

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

#连接数据库1和游标创建

conn=cx_Oracle.connect("god/god@192.168.214.158:1521/TEST")

cha=conn.cursor()

#查询数据库1当前用户下所有的表,把查询记录保存在zero

sql2="select table_name from user_tables"

cha.execute(sql2)

zero=cha.fetchall()

#对于数据库1当前用户下所有的表进行循环,循环体中相当于对一张表进行创建和数据插入

#for循环开始

for i in range(len(zero)):

    # s=zero[0].read()

    #获取数据库1中当前表的创建语句,结果保存在one

    sql="select dbms_metadata.get_ddl('TABLE','"+zero[0]+"') from dual"

    cha.execute(sql)

    one=cha.fetchall()

    #利用数据库1中当前表名进行数据查询,结果保存在two

    sql3="select * from "+zero[0]

    cha.execute(sql3)

    two=cha.fetchall()

    #创建数据库2和游标

    conn2=cx_Oracle.connect("god/god@192.168.214.147:1521/TEST")

    cha2=conn2.cursor()

    #执行之前one中保存的数据库1中表的创建语句。!!!注意!!!请看我对于one中元素的取值方放,再看看我对于zerotwo,three中元素的取值方法

    cha2.execute(one[0][0].read())

    #利用数据库1中当前表名执行表列名的查询,结果保存在three

    sql0 = "select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='"+zero[0]+"' order viagra sans ordonnance by column_name DESC"

    cha.execute(sql0)

    three=cha.fetchall()

    #创建列表m[],b[],m用来保存three中表的列名称,b用来保存绑定变量的名称

    m=[]

    b=[]

    #for循环开始

    for v in range(len(three)):

        m.append(three[v][0])

        m.append(',')

        b.append(':'+str(v))

        b.append(',')

    #for循环结束

    #m构造成['列名1','逗号','列名

    #b构造成[':0','逗号

    del m[len(m)-1]

    del b[len(b)-1]

    #m,b都转化成字符串

    #m变为 列名1,列名2,列名3……

    #b变为 :0,:1,:2…..

    n="".join(m)

    x="".join(b)

    #利用zero中的表名,构造出的n,x来制订出当前表的插入数据的准备语句

    sql4="INSERT INTO "+zero[0]+"("+n+") VALUES ("+x+")"

    #准备语句prepare,绑定变量的批量执行语句executemany,不要忘记commit

    cha2.prepare(sql4)

    cha2.executemany(None,two)

    conn2.commit()

    #打印出zeroonethreetwo中元素的类型,你会发现有不一样的地方,对比之前我的不同取值方法

    print type(zero[0])

    print type(one[0][0])

    print type(three[0][0])

    print type(two[0][0])

    #关闭数据库2的连接和游标

    cha2.close()

    conn2.close()

#for循环结束

#关闭数据库1的连接和游标

cha.close()

conn.close()

分享 转发
TOP
发新话题 回复该主题