全网整合营销服务商

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

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

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

我在工作的时候,在测试环境下使用的数据库跟生产环境的数据库不一致,当我们的测试环境下的数据库完成测试准备更新到生产环境上的数据库时候,需要准备更新脚本,真是一不小心没记下来就会忘了改了哪里,哪里添加了什么,这个真是非常让人头疼。因此我就试着用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 实现数据库(SQL)更新脚本的生成方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!


# 数据库更新脚本  # python  # 生成数据库脚本  # python3 pandas 读取MySQL数据和插入的实例  # python连接mysql数据库示例(做增删改操作)  # Python爬取数据并写入MySQL数据库的实例  # Python实现生成随机数据插入mysql数据库的方法  # 对python插入数据库和生成插入sql的示例讲解  # 放在  # 目录下  # 小编  # 我就  # 就会  # 让人  # 我在  # 我这  # 下了  # 给大家  # 几种  # 当我们  # 试着  # 来实现  # 改了  # 很方便  # 所述  # 数据库中  # 给我留言  # 新到 


相关文章: 建站主机如何选?高性价比方案全解析  建站与域名管理如何高效结合?  如何快速生成专业多端适配建站电话?  如何高效配置IIS服务器搭建网站?  SQL查询语句优化的实用方法总结  网站图片在线制作软件,怎么在图片上做链接?  如何在建站宝盒中设置产品搜索功能?  如何快速搭建高效可靠的建站解决方案?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  建站之星后台密码如何安全设置与找回?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  如何选择最佳自助建站系统?快速指南解析优劣  已有域名和空间如何快速搭建网站?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  上海网站制作开发公司,上海买房比较好的网站有哪些?  建站之星如何快速解决建站难题?  如何通过VPS建站无需域名直接访问?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  c# 在ASP.NET Core中管理和取消后台任务  如何通过商城自助建站源码实现零基础高效建站?  c# 服务器GC和工作站GC的区别和设置  网站制作公司排行榜,四大门户网站排名?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  简历在线制作网站免费,免费下载个人简历的网站是哪些?  如何挑选高效建站主机与优质域名?  建站之星在线客服如何快速接入解答?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  建站之星伪静态规则如何正确配置?  三星网站视频制作教程下载,三星w23网页如何全屏?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  网站app免费制作软件,能免费看各大网站视频的手机app?  实现虚拟支付需哪些建站技术支撑?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  C#怎么使用委托和事件 C# delegate与event编程方法  建站主机选购指南:核心配置与性价比推荐解析  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站之星导航如何优化提升用户体验?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  如何在新浪SAE免费搭建个人博客?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  XML的“混合内容”是什么 怎么用DTD或XSD定义 

您的项目需求

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