全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python 实现数据库更新脚本的生成方法

我在工作的时候,在测试环境下使用的数据库跟生产环境的数据库不一致,当我们的测试环境下的数据库完成测试准备更新到生产环境上的数据库时候,需要准备更新脚本,真是一不小心没记下来就会忘了改了哪里,哪里添加了什么,这个真是非常让人头疼。因此我就试着用Python来实现自动的生成更新脚本,以免我这烂记性,记不住事。

主要操作如下:

1.在原先 basedao.py 中添加如下方法,这样旧能很方便的获取数据库的数据,为测试数据库和生产数据库做对比打下了基础。

def select_database_struts(self):
    '''
    查找当前连接配置中的数据库结构以字典集合
    '''
    sql = '''SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_TYPE, COLUMN_KEY, COLUMN_COMMENT
        FROM information_schema.`COLUMNS` 
        WHERE TABLE_SCHEMA="%s" AND TABLE_NAME="{0}" '''%(self.__database)
    struts = {}
    for k in self.__primaryKey_dict.keys():
      self.__cursor.execute(sql.format(k))
      results = self.__cursor.fetchall()
      struts[k] = {}
      for result in results:
        struts[k][result[0]] = {}
        struts[k][result[0]]["COLUMN_NAME"] = result[0]
        struts[k][result[0]]["IS_NULLABLE"] = result[1]
        struts[k][result[0]]["COLUMN_TYPE"] = result[2]
        struts[k][result[0]]["COLUMN_KEY"] = result[3]
        struts[k][result[0]]["COLUMN_COMMENT"] = result[4]
    return self.__config, struts

2.编写对比的Python脚本

'''
数据库迁移脚本, 目前支持一下几种功能:
1.生成旧数据库中没有的数据库表执行 SQL 脚本(支持是否带表数据),生成的 SQL 脚本在 temp 目录下(表名.sql)。
2.生成添加列 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。
3.生成修改列属性 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。
4.生成删除列 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。
'''
import json, os, sys
from basedao import BaseDao

temp_path = sys.path[0] + "/temp"
if not os.path.exists(temp_path):
  os.mkdir(temp_path)

def main(old, new, has_data=False):
  '''
  @old 旧数据库(目标数据库)
  @new 最新的数据库(源数据库)
  @has_data 是否生成结构+数据的sql脚本 
  '''
  clear_temp()  # 先清理 temp 目录
  old_config, old_struts = old
  new_config, new_struts = new
  for new_table, new_fields in new_struts.items():
    if old_struts.get(new_table) is None:
      gc_sql(new_config["user"], new_config["password"], new_config["database"], new_table, has_data)
    else:
      cmp_table(old_struts[new_table], new_struts[new_table], new_table)

def cmp_table(old, new, table):
  '''
  对比表结构生成 sql
  '''
  old_fields = old
  new_fields = new

  sql_add_column = "ALTER TABLE `{TABLE}` ADD COLUMN `{COLUMN_NAME}` {COLUMN_TYPE} COMMENT '{COLUMN_COMMENT}';\n"
  sql_change_column = "ALTER TABLE `{TABLE}` CHANGE `{COLUMN_NAME}` `{COLUMN_NAME}` {COLUMN_TYPE} COMMENT '{COLUMN_COMMENT}';\n"
  sql_del_column = "ALTER TABLE `{TABLE}` DROP {COLUMN_NAME};"

  if old_fields != new_fields:
    f = open(sys.path[0] + "/temp/deploy.sql", "a", encoding="utf8")
    content = ""
    for new_field, new_field_dict in new_fields.items():
      old_filed_dict = old_fields.get(new_field)
      if old_filed_dict is None:
        # 生成添加列 sql
        content += sql_add_column.format(TABLE=table, **new_field_dict)
      else:
        # 生成修改列 sql
        if old_filed_dict != new_field_dict:
          content += sql_change_column.format(TABLE=table, **new_field_dict)
        pass
    # 生成删除列 sql
    for old_field, old_field_dict in old_fields.items():
      if new_fields.get(old_field) is None:
        content += sql_del_column.format(TABLE=table, COLUMN_NAME=old_field)
        
    f.write(content)
    f.close()

def gc_sql(user, pwd, db, table, has_data):
  '''
  生成 sql 文件
  '''
  if has_data:
    sys_order = "mysqldump -u%s -p%s %s %s > %s/%s.sql"%(user, pwd, db, table, temp_path, table)
  else:
    sys_order = "mysqldump -u%s -p%s -d %s %s > %s/%s.sql"%(user, pwd, db, table, temp_path, table)
  os.system(sys_order)

def clear_temp():
  '''
  每次执行的时候调用这个,先清理下temp目录下面的旧文件
  '''
  if os.path.exists(temp_path):
    files = os.listdir(temp_path)
    for file in files:
      f = os.path.join(temp_path, file)
      if os.path.isfile(f):
        os.remove(f)
  print("临时文件目录清理完成")

if __name__ == "__main__":
  test1_config = {
    "user" : "root", 
    "password" : "root",
    "database" : "test1", 
  }
  test2_config = {
    "user" : "root", 
    "password" : "root",
    "database" : "test2", 
  }
  
  test1_dao = BaseDao(**test1_config)
  test1_struts = test1_dao.select_database_struts()
  
  test2_dao = BaseDao(**test2_config)
  test2_struts = test2_dao.select_database_struts()

  main(test2_struts, test1_struts)

目前只支持了4种SQL脚本的生成。

以上这篇Python 实现数据库更新脚本的生成方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# 数据库生成脚本  # Python实现的简单模板引擎功能示例  # shell命令行  # 一键创建 python 模板文件脚本方法  # 使用pycharm生成代码模板的实例  # Python实现自动添加脚本头信息的示例代码  # 对python实现模板生成脚本的方法详解  # 放在  # 目录下  # 给大家  # 我就  # 就会  # 让人  # 我在  # 我这  # 下了  # 希望能  # 几种  # 当我们  # 这篇  # 试着  # 来实现  # 改了  # 很方便  # 数据库中  # 小编  # 大家多多 


相关文章: 网站网页制作专业公司,怎样制作自己的网页?  制作销售网站教学视频,销售网站有哪些?  智能起名网站制作软件有哪些,制作logo的软件?    网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  网站微信制作软件,如何制作微信链接?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  如何配置WinSCP新建站点的密钥验证步骤?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  如何通过VPS建站无需域名直接访问?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  如何快速生成凡客建站的专业级图册?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  建站主机服务器选型指南与性能优化方案解析  制作网站的软件免费下载,免费制作app哪个平台好?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  建站主机是否等同于虚拟主机?  建站之星在线版空间:自助建站+智能模板一键生成方案  浅谈Javascript中的Label语句  如何基于云服务器快速搭建网站及云盘系统?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  电脑免费海报制作网站推荐,招聘海报哪个网站多?  如何通过VPS建站实现广告与增值服务盈利?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  建站之星安装提示数据库无法连接如何解决?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  成都网站制作公司哪家好,四川省职工服务网是做什么用?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  如何通过远程VPS快速搭建个人网站?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  宝塔建站后网页无法访问如何解决?  如何在建站之星绑定自定义域名?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  建站主机空间推荐 高性价比配置与快速部署方案解析  Python lxml的etree和ElementTree有什么区别  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  建站之星安装后如何自定义网站颜色与字体?  黑客如何通过漏洞一步步攻陷网站服务器?  html制作网站的步骤有哪些,iapp如何添加网页?  建站主机服务器选购指南:轻量应用与VPS配置解析  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  如何通过宝塔面板实现本地网站访问?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  如何选择高性价比服务器搭建个人网站?  c# 在高并发场景下,委托和接口调用的性能对比 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。