我在工作的时候,在测试环境下使用的数据库跟生产环境的数据库不一致,当我们的测试环境下的数据库完成测试准备更新到生产环境上的数据库时候,需要准备更新脚本,真是一不小心没记下来就会忘了改了哪里,哪里添加了什么,这个真是非常让人头疼。因此我就试着用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 中。
注意事项:
1.系统必须配置 mysql 的环境变量,确保 mysqldump 指令能执行。
2.数据库表必须带有主键。
'''
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)
try:
res = os.system(sys_order)
if res == 0:
print("生成%s表sql文件。"%table)
except Exception as e:
print(e) 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的可以加QQ群:626787819,有啥意见或者建议的可以发我邮箱:410093793@qq.com。

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

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

    最近在学习使用PowerDesigner 这个数据库设计工具,发现真的很强大,可以做很多事情,其中就涉及到如果数据库要进行更新了怎么办,主要是增加表,最麻烦的是修改字段名称,增加字段等操作,遇到主要的 ...

  2. Pymysql+Pandas+Sqlalchemy数据库更新脚本编写

    #导入需要的包,使用pymysql操作数据库 #pandas包很强大,可以直接读取数据表,创建dataframe数据结构,同时可以直接将dataframe导出到数据库 #sqlalchemy创建引擎, ...

  3. mysql数据库更新

    在使用mysql数据库的时候,A方使用一个版本,B方在使用一个版本数据库进行开发使用,B方在开发的时候,有新的需求,需要添加表字段和所需要的表.但是A方已经在使用之前的版本数据库并且数据库里面有真实的 ...

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

    上次的那几个脚本这次全部整合到了一起,而且后面发现了一个可以使用的ODBC包,于是这次采用的方式就很简单了,直接通过ODBC将InterBase数据库中的数据全部取出来之后通过Python的sqlal ...

  5. python脚本批量生成数据

    在平时的工作中,经常会遇到造数据,特别是性能测试的时候更是需要大量的数据.如果一条条的插入数据库或者一条条的创建数据,效率未免有点低.如何快速的造大量的测试数据呢?在不熟悉存储过程的情况下,今天给大家 ...

  6. Python数据库备份脚本

    Python数据库备份脚本 #!/usr/bin/env python # author: liudong # -*- coding: utf-8 -*- # filename: db_bak.py ...

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

    这两天Google墙得严重,于是就产生了做个一键更新hosts的脚本的想法. 由于正在学习Python,理所当然用Python来写这个脚本了. 接触比较多的就是urllib2这个库,习惯性的impor ...

  8. python 从数据库表生成model

    python 从数据库表生成model 找了很久才找到这个,我是新手... 现在已有建好的数据库,需要基于原有数据做数据分析的web应用,我选择python+Tornado ,由于不想写SQL语句,就 ...

  9. atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4

    atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4 目前近况:: 更换数据库,但是是使用spring集成的. <!-- hibernate配置文件路径 --> ...

随机推荐

  1. SS、SP、BP寄存器

    SS, SP, BP 三个寄存器 SS:存放栈的段地址: SP:堆栈寄存器SP(stack pointer)存放栈的偏移地址; BP: 基数指针寄存器BP(base pointer)是一个寄存器,它的 ...

  2. Ubuntu系统上All-in-one部署OpenStack

    虚拟机软件:VMware Workstaion12 操作系统:Ubuntu14.04 1.修改Ubuntu14.04的apt源为国内的阿里源: cp /etc/apt/sources.list /et ...

  3. excel实用技巧——vlookup函数

    1.VLOOKUP函数的套路 VLOOKUP(要找谁,在哪儿找,返回第几列的内容,精确找还是近似找) 最后一个参数: 如果为0或FASLE,用精确匹配方式,而且支持无序查找: 如果为TRUE或被省略, ...

  4. WFP loading 窗口显示 SplashScreen

    public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { Spl ...

  5. Huploadify V2.1+ SpringMVC上传文件的实现

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. python基础2之字符串、列表、字典、集合

    内容概要: 一.python2 or 3 二.字符串拼接 三.字符串 四.列表.元祖 五.字典 六.集合 七.练习 一.python2 or python3 目前大多使用python2.7,随着时间的 ...

  7. 20155334 曹翔 Exp3 免杀原理与实践

    20155334 曹翔 Exp3 免杀原理与实践 小记:这次实验,困难重重,失败练练,搞得我们是心急如焚,焦头烂额,哭爹喊娘 一.基础问题回答 杀软是如何检测出恶意代码的? 每个杀软都有自己的检测库, ...

  8. WPF编程,自定义鼠标形状的一种方法。

    原文:WPF编程,自定义鼠标形状的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8727 ...

  9. flask前端与后端之间传递的两种数据格式:json与FormData

    json格式 双向! 前端 ==>后端:json格式 后端 ==>前端:json格式 html <!-- html部分 --> <form enctype='applic ...

  10. CS50.5

    函数,全局变量,参数,返回值. 1,类型转换. 各种数据类型进行转换 2,API函数 应用程序编程接口. application programming interface 写写随笔吧,先说计算机.. ...