领导的要求:同一个系统有多个环境,数据库用的是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()