Python生成脚本–实现数据库更新

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

  主要操作如下:

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

Python生成脚本--实现数据库更新Python生成脚本--实现数据库更新

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

登录后复制View Code

  2.编写对比的Python脚本

Python生成脚本--实现数据库更新Python生成脚本--实现数据库更新

  1 '''  2 数据库迁移脚本, 目前支持一下几种功能:  3 1.生成旧数据库中没有的数据库表执行 SQL 脚本(支持是否带表数据),生成的 SQL 脚本在 temp 目录下(表名.sql)。  4 2.生成添加列 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。  5 3.生成修改列属性 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。  6 4.生成删除列 SQL 脚本,生成的 SQL 脚本统一放在 temp 目录下的 depoyed.sql 中。  7 '''  8 import json, os, sys  9 from basedao import BaseDao 10  11 temp_path = sys.path[0] + "/temp" 12 if not os.path.exists(temp_path): 13     os.mkdir(temp_path) 14  15 def main(old, new, has_data=False): 16     ''' 17     @old 旧数据库(目标数据库) 18     @new 最新的数据库(源数据库) 19     @has_data 是否生成结构+数据的sql脚本  20     ''' 21     clear_temp()    # 先清理 temp 目录 22     old_config, old_struts = old 23     new_config, new_struts = new 24     for new_table, new_fields in new_struts.items(): 25         if old_struts.get(new_table) is None: 26             gc_sql(new_config["user"], new_config["password"], new_config["database"], new_table, has_data) 27         else: 28             cmp_table(old_struts[new_table], new_struts[new_table], new_table) 29  30 def cmp_table(old, new, table): 31     ''' 32     对比表结构生成 sql 33     ''' 34     old_fields = old 35     new_fields = new 36  37     sql_add_column = "ALTER TABLE `{TABLE}` ADD COLUMN `{COLUMN_NAME}` {COLUMN_TYPE} COMMENT '{COLUMN_COMMENT}';" 38     sql_change_column = "ALTER TABLE `{TABLE}` CHANGE `{COLUMN_NAME}` `{COLUMN_NAME}` {COLUMN_TYPE} COMMENT '{COLUMN_COMMENT}';" 39     sql_del_column = "ALTER TABLE `{TABLE}` DROP {COLUMN_NAME};" 40  41     if old_fields != new_fields: 42         f = open(sys.path[0] + "/temp/deploy.sql", "a", encoding="utf8") 43         content = "" 44         for new_field, new_field_dict in new_fields.items(): 45             old_filed_dict = old_fields.get(new_field) 46             if old_filed_dict is None: 47                 # 生成添加列 sql 48                 content += sql_add_column.format(TABLE=table, **new_field_dict) 49             else: 50                 # 生成修改列 sql 51                 if old_filed_dict != new_field_dict: 52                     content += sql_change_column.format(TABLE=table, **new_field_dict) 53                 pass 54         # 生成删除列 sql 55         for old_field, old_field_dict in old_fields.items(): 56             if new_fields.get(old_field) is None: 57                 content += sql_del_column.format(TABLE=table, COLUMN_NAME=old_field) 58                  59         f.write(content) 60         f.close() 61  62 def gc_sql(user, pwd, db, table, has_data): 63     ''' 64     生成 sql 文件 65     ''' 66     if has_data: 67         sys_order = "mysqldump -u%s -p%s %s %s > %s/%s.sql"%(user, pwd, db, table, temp_path, table) 68     else: 69         sys_order = "mysqldump -u%s -p%s -d %s %s > %s/%s.sql"%(user, pwd, db, table, temp_path, table) 70     os.system(sys_order) 71  72 def clear_temp(): 73     ''' 74     每次执行的时候调用这个,先清理下temp目录下面的旧文件 75     ''' 76     if os.path.exists(temp_path): 77         files = os.listdir(temp_path) 78         for file in files: 79             f = os.path.join(temp_path, file) 80             if os.path.isfile(f): 81                 os.remove(f) 82     print("临时文件目录清理完成") 83  84 if __name__ == "__main__": 85     test1_config = { 86         "user" : "root",  87         "password" : "root", 88         "database" : "test1",  89     } 90     test2_config = { 91         "user" : "root",  92         "password" : "root", 93         "database" : "test2",  94     } 95      96     test1_dao = BaseDao(**test1_config) 97     test1_struts = test1_dao.select_database_struts() 98      99     test2_dao = BaseDao(**test2_config)100     test2_struts = test2_dao.select_database_struts()101 102     main(test2_struts, test1_struts)

登录后复制View Code

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

立即学习“Python免费学习笔记(深入)”;

  如果有感兴趣一起学习、讨论Python的可以加QQ群:626787819,有啥意见或者建议的可以发我邮箱:410093793@qq.com。

以上就是Python生成脚本–实现数据库更新的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2268359.html

(0)
上一篇 2025年2月27日 10:41:46
下一篇 2025年2月27日 10:42:02

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 计算机语言是什么

    计算机语言是用于与计算机通信的符号系统,它包括机器语言和高级语言。高级语言使用接近英语的语法,允许我们更轻松地向计算机传达命令,并理解其响应。 计算机语言 什么是计算机语言? 计算机语言是用来书写程序和与计算机通信的符号系统。它是一种人类语…

    2025年2月27日
    200
  • python的数据结构

    数据结构:是指通过某种方式组织在一起的数据元素的集合 主要包括: 序列:主要介绍列表、元组、字符串 映射:字典 集合(set) 立即学习“Python免费学习笔记(深入)”;   列表:shoplist = [‘apple&#8…

    编程技术 2025年2月27日
    200
  • 计算机编程语言有哪些种类

    主要的计算机编程语言类别包括:编译型(C、C++、Java)、解释型(Python、JavaScript、PHP)、脚本(Bash、PowerShell、VBScript)、逻辑(Prolog、Mercury)、函数式(Haskell、Sc…

    2025年2月27日
    200
  • python字符串反转

    str类型python并没有reverse函数。 然而,通过反向步进切片,我们可以高效地反转一串字符串。 仅支持英文字符。 例: 1 a = ‘example’2 b = a[::-1]3 print(b)4 #输出结果’elpmaxe’ …

    编程技术 2025年2月27日
    200
  • 编程现在学什么语言好

    对于初学者来说,推荐学习Python或JavaScript,而随着经验的增长,还可以考虑掌握Java、C++或C#。 编程现在学什么语言好 随着科技的飞速发展,掌握编程语言已成为一项必备技能。选择一门编程语言对于初学者来说可能是一项艰巨的任…

    2025年2月27日
    200
  • Python基础学习总结(四)

    6.高阶特性 6.1迭代   如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(iteration)。在python中,迭代是通过for … in来完成的。   因为d…

    编程技术 2025年2月27日
    200
  • 程序语言有哪几种语言

    程序语言有以下类型:通用编程语言(C、C++、Java、Python、C#)脚本语言(JavaScript、PHP、Ruby、Bash)标记语言(HTML、XML、JSON)汇编语言(MASM、ARM Assembly) 程序语言类型 程序…

    2025年2月27日
    200
  • Python面向对象编程(二)

    1.继承与派生 上文我们已经说过,Python中一切皆对象。我们从对象中抽取了共同特征和技能,得到了类的概念。类与类之间也有共同特征,我们可以从有共同特征和技能的类中提取共同的技能和特征,叫做父类。 比如老师和学生,都有名字,年纪,生日,性…

    2025年2月27日 编程技术
    200
  • 电脑编程入门学什么语言

    对于初学者来说,理想的入门编程语言应具备易学性、充足的资源和广泛的应用领域。推荐的入门语言依次是:PythonJavaC#JavaScriptHTML 和 CSS 电脑编程入门学什么语言? 对于电脑编程入门者,选择合适的语言非常重要。理想的…

    2025年2月27日
    200
  • 推荐几本关于的Python好书

    不可错过的十本python好书,分别适合入门、进阶到精深三个不同阶段的人来阅读,感兴趣的小伙伴们可以参考一下 以往的文章中小编已经给大家陆续推荐了很多的Python书籍,可以说品种齐全、本本经典了,不知道你是不是已经眼花缭乱,不知道该选择哪…

    2025年2月27日 编程技术
    200

发表回复

登录后才能评论