用python比较不同环境下数据库表与表结构的信息

领导的要求:同一个系统有多个环境,数据库用的是mysql ,需要比较一下他们的表和表结构信息,由于网络问题不能直接用mysqldiff 工具比较,所以我用了python下pandas 、list、pymysql来操作。

操作思路:

比较表
1.用pymysql 连接测试环境1和测试环境2的数据库;
2.读取表的信息,转存在pandas 的数据框中df1和df2;
3.读取数据框中的表名,转成列表格式,就可以比对两个表的异同点;
4.转存表信息的数据框为excel文件

比较表结构
1.相同表的列表,读取对应得表结构信息df1_DE和df2_DE;
2.找出两个数据框的异同

范例1l(两个都可以连接网络的):

import pandas as pd
import pymysql
#连接测试环境1 ,阿里云上的
conn = pymysql.connect(host='r*********.mysql.rds.aliyuncs.com',user='*****',password='*****',db='abc',port=3306,charset='utf8')
cursor = conn.cursor()
#df为阿里云上的数据库abc的数据表信息
df=pd.read_sql("select TABLE_NAME from information_schema.tables where TABLE_SCHEMA='abc'",conn)
df_table_list=df['TABLE_NAME'].to_list()
#连接测试环境2 ,本地的
conn1 = pymysql.connect(host='*******',user='*****',password='*****',db='abc',port=3306,charset='utf8')
cursor1 = conn1.cursor()
#df1为本地的数据库ab数据表信息
df1=pd.read_sql("select TABLE_NAME from information_schema.tables where TABLE_SCHEMA='abc'",conn1)
df1_table_list=df1['TABLE_NAME'].to_list()
#找出两个数据框相同的表的信息
table_list=[x for x in df_table_list if x in df1_table_list]
#查看相同表的个数
len(table_list)
#新建数据框本地数据库df_test_table
df_test_table=pd.DataFrame()
#新建数据框阿里云数据库df_online_table
df_online_table=pd.DataFrame()
#两个数据框df_test_table和df_online_table的合集
df_diff_table_DE=pd.DataFrame()
df_diff_table=pd.DataFrame()
for table in test_table_list:
    #查询每张表的表结果信息的sql 语句,用for循环
    sql1 = f"select COLUMN_NAME,COLUMN_TYPE,ORDINAL_POSITION from information_schema.columns where TABLE_SCHEMA='abc' and TABLE_NAME='{table}'"
    #执行查询语句
    df_test=pd.read_sql(sql1,conn1)
    #df_test数据框中添加TABLE_NAME列,并赋值为变量table
    df_test['TABLE_NAME']=table
    #df_test数据框中添加TABLE_TYPE列,并赋值为常量字符串test
    df_test['TABLE_TYPE']='test'
    #for循环的数据框df_test插入到df_test_table中,并且重建索引
    df_test_table=df_test_table.append(df_test,ignore_index=True)

    #执行查询语句
    df_online=pd.read_sql(sql1,conn)
    #df_online数据框中添加TABLE_NAME列,并赋值为变量table
    df_online['TABLE_NAME']=table
    #df_test数据框中添加TABLE_TYPE列,并赋值为常量字符串online
    df_online['TABLE_TYPE']='online'
    df_online_table=df_online_table.append(df_online,ignore_index=True)

   #比较两个相同表之间的表字段,不同的哪些保存下来
    df_diff_table_DE=df_diff_table_DE.append(df_test_table)
    df_diff_table_DE=df_diff_table_DE.append(df_online_table)
    df_diff_table_DE=df_diff_table_DE.drop_duplicates(subset=['COLUMN_NAME','COLUMN_TYPE','ORDINAL_POSITION','TABLE_NAME'],keep=False)
    df_diff_table=df_diff_table.append(df_diff_table_DE,ignore_index=True)
#保存相关信息
writer = pd.ExcelWriter('E:\\TABLENAME.xlsx')
#阿里云上的数据库表信息
df.to_excel(writer, sheet_name='online_table')
#本地的数据库表信息
df1.to_excel(writer, sheet_name='bendi_table')
#本地的数据表的表结构
df_test_table.to_excel(writer, sheet_name='gtja_table_DE')
#阿里云上的数据表的表结构
df_online_table.to_excel(writer, sheet_name='online_table_DE')
#相同表名不同的表结构
df_diff_table.to_excel(writer, sheet_name='df_diff_table')
writer.save()

范例1l(两个不能直接互连网络的)
##将上面的文件上传到目的主机,我们以阿里云的数据表对比隔离网络的数据表
import pandas as pd
import pymysql
#连接隔离环境2 ,本地的
conn2 = pymysql.connect(host='*******',user='*****',password='*****',db='abc',port=3306,charset='utf8')
cursor2 = conn2.cursor()
#df1为本地的数据库ab数据表信息
df3=pd.read_sql("select TABLE_NAME from information_schema.tables where TABLE_SCHEMA='abc'",conn2)
df3_table_list=df3['TABLE_NAME'].to_list()
#读取范例一的数据库表格文件的表名和表结构信息
#df4 = pd.read_excel(r'/opt/TABLENAME.xlsx',sheet_name='online_table')
df_online_table=pd.read_excel(r'/opt/TABLENAME.xlsx',sheet_name='online_table_DE')
#df4 的表格信息TABLE_NAME转换为列表
df4_table_list=df4['TABLE_NAME'].to_list()
#找出两个数据框相同的表的信息
table_list2=[x for x in df3_table_list if x in df4_table_list]
#查看相同表的个数
len(table_list)
df_re_table=pd.DataFrame()
df_online1_table=pd.DataFrame()
#两个数据框df_test_table和df_online_table的合集
df_diff_table_DE=pd.DataFrame()
df_diff_table=pd.DataFrame()
for table in test_table_list:
    #查询隔离环境
    #每张表的表结果信息的sql 语句,用for循环
    sql1 = f"select COLUMN_NAME,COLUMN_TYPE,ORDINAL_POSITION from information_schema.columns where TABLE_SCHEMA='abc' and TABLE_NAME='{table}'"
    #执行查询语句
    df_re=pd.read_sql(sql1,conn2)
    #df_test数据框中添加TABLE_NAME列,并赋值为变量table
    df_re['TABLE_NAME']=table
    #df_test数据框中添加TABLE_TYPE列,并赋值为常量字符串test
    df_re['TABLE_TYPE']='re'
    #for循环的数据框df_test插入到df_test_table中,并且重建索引
    df_re_table=df_re_table.append(df_re,ignore_index=True)
    
    #找出阿里云上对应表名的对应表结构信息
    a = df_online_table[(df_online_table['TABLE_NAME']==table)]
    df_online1_table=df_online1_table.append(a,ignore_index=True)
#比较两个相同表之间的表字段,不同的哪些保存下来
df_diff_table_DE=df_diff_table_DE.append(df_online1_table)
df_diff_table_DE=df_diff_table_DE.append(df_re_table)
df_diff_table_DE=df_diff_table_DE.drop_duplicates(subset=['COLUMN_NAME','COLUMN_TYPE','ORDINAL_POSITION','TABLE_NAME'],keep=False)
df_diff_table=df_diff_table.append(df_diff_table_DE,ignore_index=True)
#保存相关信息
writer = pd.ExcelWriter('/opt/TABLENAME2.xlsx')
#隔离环境的数据库表信息
df3.to_excel(writer, sheet_name='geli_table')
#隔离环境的相同数据表的表结构
df_re_table.to_excel(writer, sheet_name='geli_table_DE')
#相同表名下不同的表结构
df_diff_table.to_excel(writer, sheet_name='df_diff_table')
writer.save()    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值