异构数据库表结构复制(sqlserver-mysql)

只复制表结构

import pymssql
import pymysql
import pandas as pd

#构建数据库连接
conn_1 = pymssql.connect(host = '121.xxx.xx.xx',
                         port = 1433,
                         user = 'cdcreader',
                         password = '123456',
                         database = 'abc_car')
    
conn_2 = pymysql.connect(host = '192.168.xx.xxx',
                         port = 3306,
                         user = 'test',
                         password = '123456',
                         database = 'ods_1')
#数据类型映射
map_mssql2mysql = {
'bigint':'bigint',
'int':'int',
'tinyint':'tinyint',
'smallint':'smallint',
'bit':'boolean',
'decimal':'decimal',
'money':'decimal',
'smallmoney':'decimal',
'numeric':'numeric',
'float':'float',
'real':'float',
'date':'date',
'datetimeoffset':'timestamp',
'datetime2':'datetime(3)',
'datetime':'datetime(3)',
'smalldatetime':'timestamp',
'time':'time',
'char':'char',
'nchar':'varchar',
'varchar':'varchar',
'nvarchar':'varchar',
'text':'text',
'ntext':'text',
'xml':'text',
'binary':'binary',
'varbinary':'varbinary'
}

# 准备迁移的表
schema = "'dbo'"
sql_1 = """select object_id, name from sys.objects where type ='U' and
    schema_id= (select schema_id from sys.schemas where name= """ + schema + ')'
    
tables = pd.DataFrame(pd.read_sql(sql_1,conn_1))

# 获取sqlserver表信息,构造mysql建表语句
for index, tb_row in tables.iterrows():
    
    object_id = tb_row.object_id
    tb_name = tb_row['name']
    
    if tb_name[:3] != 'pit':
        continue
    
    # 获取表字段数据类型
    sql_2 = """select
    a.name as col,
    b.name as datatype,
    a.max_length,
    a.precision,
    a.scale,
    a.collation_name
    from sys.columns a join sys.types b on b.user_type_id=a.user_type_id
    where a.object_id=""" + str(object_id)
    
    tb_info = pd.DataFrame(pd.read_sql(sql_2,conn_1))
    
    # 获取主键
    sql_3 = """select
    c.name as kel_col
    from sys.indexes a
    JOIN sys.index_columns b on b.object_id=a.object_id and b.index_id=a.index_id
    JOIN sys.columns c on c.object_id=a.object_id and c.column_id=b.column_id
    WHERE a.is_primary_key=1 and a.object_id=""" + str(object_id)
    
    tb_keys = pd.read_sql(sql_3,conn_1).values.ravel()
    
    db_cols = []
    
    # 字段和数据类型信息
    for index, i_row in tb_info.iterrows():
        
        datatype = map_mssql2mysql[(i_row.datatype)]
        
        # 字符数大于2000的字段,数据类型映射为text;若不限制,则为8000
        if i_row.max_length > 2000:
            datatype = 'text'
        elif i_row.max_length == -1:
            datatype = 'text'
            i_row.max_length = 8000
            
        col = '`' + i_row.col + '`'
        
        # 中文编码的Unicode标准字符集,字符数等于字节数除2
        if i_row.collation_name != None and (i_row.collation_name)[:7].lower() == 'chinese' \
        and (i_row.datatype)[0] == 'n':
            i_row.max_length = int(i_row.max_length/2)
            
        if i_row.precision == 0 and i_row.scale == 0:
            db_col = col + ' ' + datatype + '(' + str(i_row.max_length) + ')'
        elif datatype in ['decimal','numeric','money','smallmoney']:
            db_col = col + ' ' + datatype + '(' + str(i_row.precision) + ',' + str(i_row.scale) + ')'
        else:
            db_col = col + ' ' + datatype
                     
        db_cols.append(db_col)
    
    # 构造建表语句
    if tb_keys == []:
        key_conf = ''
    else:
        key_conf = '\n,primary key (' + ','.join(tb_keys) + ')'
        
    ddl = 'create table if not exists ' + tb_name + '(' + '\n,'.join(db_cols) + key_conf + ')'
    
    print(ddl) 
    
    # 执行建表sql
    cur = conn_2.cursor()
    conn_2.ping(reconnect=True)
    #cur.execute(ddl)
        
conn_1.close()
conn_2.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值