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

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

  主要操作如下:

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

 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

  2.编写对比的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}‘;\n"
 38     sql_change_column = "ALTER TABLE `{TABLE}` CHANGE `{COLUMN_NAME}` `{COLUMN_NAME}` {COLUMN_TYPE} COMMENT ‘{COLUMN_COMMENT}‘;\n"
 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)

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

  如果有感兴趣一起学习、讨论Python的可以加QQ群:626787819,有啥意见或者建议的可以发我邮箱:[email protected]。

时间: 2024-11-09 06:03:28

Python 实现数据库更新脚本的生成的相关文章

PowerDesigner 如何生成数据库更新脚本

最近在学习使用PowerDesigner 这个数据库设计工具,发现真的很强大,可以做很多事情,其中就涉及到如果数据库要进行更新了怎么办,主要是增加表,最麻烦的是修改字段名称,增加字段等操作,遇到主要的情况我们应该怎么处理呢?接下来让我们一起揭开谜底吧: 首先,我们要将创建好的PDM模板先保存一份,可以命名为xxx_Old.pdm 修改你的PDM文件,修改后,进行导出物理数据库模型,然后选择工具栏上的database-->apply model changes to database出现一个界面选

python 导入数据库的脚本

该脚本针对批量导入数据sql文件,data目录存放所要导入的sql文件,list.txt存放要导入的列表信息. 脚本内容如下: #!/usr/bin/env python # -*- coding:utf-8 -*- import os, sys, logging, datetime # 日志文件配置 if not os.path.isdir('logs'):     os.mkdir('logs') logging.basicConfig(level=logging.INFO,        

微软ASP.NET站点部署指南(11):部署SQL Server数据库更新

1. 综述 本章节展示的是如何向完整版SQL Server 数据库部署一个数据库升级.与第9章的数据库升级部署有所不同(第9章是部署到SQL Server Compact数据库). 提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面. 2. 给表添加新列 这个小节,做一个数据库修改和相应的代码更新,在部署到测试和生产环境之前,先在Visual Studio 里测试.修改内容是给Instructor 实体添加一个OfficeHour

Python数据库迁移脚本(终极版)

上次的那几个脚本这次全部整合到了一起,而且后面发现了一个可以使用的ODBC包,于是这次采用的方式就很简单了,直接通过ODBC将InterBase数据库中的数据全部取出来之后通过Python的sqlalchemyORM框架直接连接远程的MySQL数据库,之后便可以方便的传递数据了,当然,作为我的终极完善版本,自动模式和手动模式是少不了的了,在自动模式中将自动检查InterBase数据库是否存在,如果不存在则自动restore,然后自己创建InterBase的数据源,之后便可以取出数据了,下面是流程

python脚本批量生成数据

在平时的工作中,经常会遇到造数据,特别是性能测试的时候更是需要大量的数据.如果一条条的插入数据库或者一条条的创建数据,效率未免有点低.如何快速的造大量的测试数据呢?在不熟悉存储过程的情况下,今天给大家介绍一种方法,很简单的也很实用.思路是用python代码写一段小程序,生成一定数量的SQL语句,再把这些SQL语句拷贝黏贴到数据库工具执行SQL即可. 假如有个联系人的学生表student,其表结构为姓名name.学校school.电话telphone.邮箱email. 以Mysq为例子,sql语句

【安卓】数据库基于脚本的"增量更新",每次更新时不需修改java代码、!

思路: 1.当然是基于SQLiteOpenHelper.onCreate(第一次安装程序时调用).onUpdate(升级程序时调用) 2.用"脚本"(脚本制作具体方法问度娘)做数据库升级,文件名标识对应版本,java中根据"上一版本.当前版本"选择执行的脚本. 升级时,修改DB_VERSION(当前版本)即可. DBManager.java: package com.example.test; import java.io.ByteArrayOutputStream

Python SVN 更新 脚本

#configs PROJECTS = { "away3d":"svn://svnurl/away3d", "Away3DUCtrl":"svn://svnurl/Away3DUCtrl", "Editor":"svn://svnurl/Editor", "EditorUI":"svn://svnurl/EditorUI", "Skill

用Python写的简单脚本更新本地hosts

这两天Google墙得严重,于是就产生了做个一键更新hosts的脚本的想法. 由于正在学习Python,理所当然用Python来写这个脚本了. 接触比较多的就是urllib2这个库,习惯性的import进去了.还要import一个re的库,让Python支持正则表达式.关于正则表达式我研究不多,只会点简单的,如果想了解下正则表达式可以上这个网站http://deerchao.net/tutorials/regex/regex.htm. Python比较简洁,这里就用到了个写入文件的语法.下面贴上

如何使用CLI命令在输入文件参数上运行Python脚本来生成输出文件

如何使用CLI命令在输入文件参数上运行Python脚本来生成输出文件. 根据我的理解,analysis.py是python脚本,-s和-p是分别包含Sales.csv和Products.csv中的csv数据的变量名. 在analysis.py中,我如何接受存储在-s和-p中的两个CSV,然后创建一个名为SalesReport.csv的输出? 我是否会创建一个名为SalesReport.csv的空白csv文件,然后将分析的数据写入文件? 或者命令行是否会使用存储在sales-report变量中的数