Mysql数据表结构同步Python实现

Python源码

#!/usr/bin/pythonimport MySQLdb
import configparserclass SchemaMysql:#初始化用户数据 isdrop参数为是否删除目标库多余的字段def __init__(self,src_info,des_info,isdrop):self.src_ip = src_info[0]self.src_db_user = src_info[1]self.src_db_pass = src_info[2]self.des_ip = des_info[0]self.des_db_user = des_info[1]self.des_db_pass = des_info[2]self.isDrop = isdrop#初始化不同的数据库def init(self,src_db,des_db):self.dbsrc = self.connect_db(self.src_ip,src_db,self.src_db_user,self.src_db_pass)self.dbdes = self.connect_db(self.des_ip,des_db,self.des_db_user,self.des_db_pass)self.cursorsrc = self.dbsrc.cursor()self.cursordes = self.dbdes.cursor()#手动关闭数据库def close_db(self):self.cursorsrc.close()self.cursordes.close()self.dbsrc.close()self.dbdes.close()#连接数据库def connect_db(self,ip,db,db_user,db_pass):db = MySQLdb.connect(ip,db_user,db_pass,db)return db#获取数据库中的表def getTable(self,cursor):cursor.execute("show tables")tablelist  = []for tb in cursor.fetchall():tablelist.append(tb[0])return tablelist#获取创表语句def getField(self,cursor,tb):sql = "show create table "+str(tb)cursor.execute(sql)return cursor.fetchone()#生成需要执行的sql语句def createSql(self,tb,mode,F):if mode == 'c':sql = "alter table " + str(tb) + " change " + F[0] + " " + F[0]elif mode == 'a':sql = "alter table " + str(tb) + " add " + F[0]elif mode == 'd':sql = "alter table " + str(tb) + " drop column " + F[0]return sqlelse:return Nonefor d in range(1, len(F)):sql = sql + " " + F[d]return sql#检测两个数据表字段是否一样def checkField(self,tb,sqlSrc,sqlDes):runList = []srcList = sqlSrc[1].replace(",","").split("\n")[1:-1]#去除不需要的数据desList = sqlDes[1].replace(",","").split("\n")[1:-1]for i in srcList:srcF = i.split()for j in desList:desF = j.split()if srcF[0] == desF[0]:if len(srcF) == len(desF):for c in range(1,len(srcF)):if srcF[c] != desF[c]:runList.append(self.createSql(tb,"c",srcF))else:runList.append(self.createSql(tb, "c", srcF))break;else:runList.append(self.createSql(tb, "a", srcF))if self.isDrop:srcList =  [x.split()[0] for x in srcList]desList = [x.split()[0] for x in desList]for desI in desList:if desI not in srcList:runList.append(self.createSql(tb,"d",[desI]))return runList#执行 删除字段 增加字段 修改字段的sql语句def runExec(self,runlist):for run in runlist:print runself.cursordes.execute(run)#检测数据表是否一样如果没有则在目标主机上创建def checkTable(self,tbSrc,tbDes,cursrc,curdes):for tbA in tbSrc:dataSrc = self.getField(cursrc, tbA)if tbA in tbDes:runlist = self.checkField(tbA,dataSrc,self.getField(curdes,tbA))if not runlist is None:self.runExec(runlist)else:curdes.execute(dataSrc[1].replace("\n",""))#开始运行def run(self):print "Run"srctable = self.getTable(self.cursorsrc)destable = self.getTable(self.cursordes)self.checkTable(srctable,destable,self.cursorsrc,self.cursordes)"""
获取config文件信息
包括  ip  用户  密码   表
"""
def getConfDBList():src_list = []des_list = []config = configparser.ConfigParser()config.read("config.cfg")src_list.append(config.get('SRC', 'ip'))src_list.append(config.get('SRC','user'))src_list.append(config.get("SRC",'pass'))src_list.append(config.get("SRC", 'db'))des_list.append(config.get('DES', 'ip'))des_list.append(config.get('DES', 'user'))des_list.append(config.get("DES", 'pass'))des_list.append(config.get("DES", 'db'))return [src_list,des_list]if __name__ == '__main__':list = getConfDBList()src_info = ['172.16.0.55','root','root']des_info = ['172.16.0.55', 'root', 'root']src_db = list[0][3].split(",")des_db = list[1][3].split(",")print "Begin"schema = SchemaMysql(src_info,des_info,True)for i in range(len(src_db)):if src_db[i] and des_db[i]:schema.init(src_db[i],des_db[i])schema.run()schema.close_db()

config文件:
db必须需要逗号(,)分隔可以用多个库,SRC和DES中的db数量必须一样

[SRC]
ip=172.16.0.55
user=root
pass=root
db=te01,t001
[DES]
ip=172.16.0.55
user=root
pass=root
db=te02,t002

当然数据库很复杂这只是一个简单的例子,希望有帮助

Mysql数据表结构同步Python实现相关推荐

  1. 查看mysql数据表结构的两种方法你会吗?

    教你如何查看数据表结构 当我们创建完表之后,如何查看表结构,以便于确认该表符合我们的预期呢,我们可以使用describe或者show create table命令来查看mysql数据表结构,下面我们就 ...

  2. python数据库建表_Python3创建mysql数据表结构和插入数据

    上一篇文章,我们已经成功通过 python3 连接到了数据库并新建了 spiders 数据库,今天我们就继续来学习 python3 如何创建 mysql 数据表及插入数据. import pymysq ...

  3. Navicat工具导出Mysql数据表结构到Excel文件中

    原文链接:https://blog.csdn.net/zt15732625878/article/details/77978266 ---------------------------------- ...

  4. linux mysql 结构_linux查看mysql数据表结构

    展开全部 一.简单描述表结构,字段类型 desc tabl_name; 显示32313133353236313431303231363533e78988e69d8331333365636133表结构, ...

  5. python同步两张数据表_Python 如何实现数据库表结构同步

    近日,某个QQ 群里的一个朋友提出一个问题,如何将一个DB 的表结构同步给另一个DB. 针对这个问题,我进行了思考与实践,具体的实现代码如下所示: # coding:utf-8 import pymy ...

  6. 应用容灾中,MySQL数据表是否需要跨云同步?

    简介: 容灾系统的重要目标在于保证系统数据和服务的"连续性".当系统发生故障时,容灾系统能够快速恢复服务和保证数据的有效性.为了防止天灾人祸.不可抗力,在同城或异地建立对应的IT系 ...

  7. mysql frm恢复数据_MYSQL使用.frm恢复数据表结构的实现方法

    我们都知道当我们建立数据表(innodb或myisam)时,会生成相应的文件(如:MYD,MYI,frm) 在这里,我们探讨下使用frm文件恢复 innodb和myisam类型表的结构,不过由于他们存 ...

  8. mysql 复制表结构到一个新表_MySQL复制表数据或表结构到新表中

    MySQL复制表数据到新表的几个步骤. 1.MySQL复制表结构及数据到新表 CREATE TABLE new_table SELECT * FROM old_table; 2.只复制 MySQL复制 ...

  9. Mysql数据库,项目需求需要数据还原的数据表结构构思方案

    自己构思的一些,Mysql数据库项目中常用的数据表结构 版本:mysql5.5版本及以上 一.特定数据的表构思方法[特定的数据,同时需要记录操作的] 以用户表为例,用户修改头像.昵称等操作为记录需求的 ...

最新文章

  1. 面试题目集锦 -- 排序算法
  2. Eclipse闪退/打不开/无法启动/一闪而过
  3. 2019最新 iOS Native项目集成Unity3D
  4. 计算机组成原理主存储器知识点,【考研】2020考研:计算机组成原理知识点主存储器与CPU的连接...
  5. 特征选择(feature_selection)
  6. 解决ubuntu中连接mysql时报错:Access denied for user ‘root‘@‘localhost‘
  7. 如何在SAP Spartacus里增添自定义的配置条目
  8. 【机器学习】六种算法在人脸补全中的应用比较(K紧邻,线性,决策树,岭回归,套索回归,ElasticNet)
  9. 2.2线性表的顺序表
  10. Ext3.4--布局
  11. MySQL 创建数据库并且指定编码
  12. SDL(01-10)
  13. oracle单引号和双引号的区别
  14. 终于掌握vim的寄存器和系统剪贴板的使用了- 要安装vim-X11包
  15. Linux系统教学-Lesson01
  16. 一位全加器Verilog的三种不同的描述
  17. geek卸载界的天花板
  18. 2020年10月计算机语言排名,最新!2020年10月编程语言排行榜出炉
  19. V$LOGMNR_CONTENTS字段含义
  20. couple和double的区别_DC couple与AC couple的区别? couple与pair的区别

热门文章

  1. 杰理之inein走ADC,并复用fm引脚,使用省电容接法时,进linein出来后,麦声音变得很小解决方法【篇】
  2. MyBatis配置文件(八):mappers配置
  3. 洛谷 P3481 [POI2009]PRZ-Algorithm Speedup
  4. ❤echarts桑葚图的使用以及桑葚图详细配置
  5. 可视化 | 让矩阵在散点图中动起来
  6. 电梯限速器测试仪的现场操作培训及限速器常见故障分析
  7. Web基础配置篇(一): Java环境配置
  8. 7.emment语法小结
  9. 人类记忆模式的不可靠性--《潜意识-控制你行为的秘密》
  10. TeamViewer 15.6.7新版本发布