国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python 實(shí)現(xiàn)數(shù)據(jù)庫(kù)更新腳本的生成方法

2019-11-25 16:02:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

我在工作的時(shí)候,在測(cè)試環(huán)境下使用的數(shù)據(jù)庫(kù)跟生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù)不一致,當(dāng)我們的測(cè)試環(huán)境下的數(shù)據(jù)庫(kù)完成測(cè)試準(zhǔn)備更新到生產(chǎn)環(huán)境上的數(shù)據(jù)庫(kù)時(shí)候,需要準(zhǔn)備更新腳本,真是一不小心沒(méi)記下來(lái)就會(huì)忘了改了哪里,哪里添加了什么,這個(gè)真是非常讓人頭疼。因此我就試著用Python來(lái)實(shí)現(xiàn)自動(dòng)的生成更新腳本,以免我這爛記性,記不住事。

主要操作如下:

1.在原先 basedao.py 中添加如下方法,這樣舊能很方便的獲取數(shù)據(jù)庫(kù)的數(shù)據(jù),為測(cè)試數(shù)據(jù)庫(kù)和生產(chǎn)數(shù)據(jù)庫(kù)做對(duì)比打下了基礎(chǔ)。

def select_database_struts(self):    '''    查找當(dāng)前連接配置中的數(shù)據(jù)庫(kù)結(jié)構(gòu)以字典集合    '''    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.編寫(xiě)對(duì)比的Python腳本

'''數(shù)據(jù)庫(kù)遷移腳本, 目前支持一下幾種功能:1.生成舊數(shù)據(jù)庫(kù)中沒(méi)有的數(shù)據(jù)庫(kù)表執(zhí)行 SQL 腳本(支持是否帶表數(shù)據(jù)),生成的 SQL 腳本在 temp 目錄下(表名.sql)。2.生成添加列 SQL 腳本,生成的 SQL 腳本統(tǒng)一放在 temp 目錄下的 depoyed.sql 中。3.生成修改列屬性 SQL 腳本,生成的 SQL 腳本統(tǒng)一放在 temp 目錄下的 depoyed.sql 中。4.生成刪除列 SQL 腳本,生成的 SQL 腳本統(tǒng)一放在 temp 目錄下的 depoyed.sql 中。'''import json, os, sysfrom basedao import BaseDaotemp_path = sys.path[0] + "/temp"if not os.path.exists(temp_path):  os.mkdir(temp_path)def main(old, new, has_data=False):  '''  @old 舊數(shù)據(jù)庫(kù)(目標(biāo)數(shù)據(jù)庫(kù))  @new 最新的數(shù)據(jù)庫(kù)(源數(shù)據(jù)庫(kù))  @has_data 是否生成結(jié)構(gòu)+數(shù)據(jù)的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):  '''  對(duì)比表結(jié)構(gòu)生成 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():  '''  每次執(zhí)行的時(shí)候調(diào)用這個(gè),先清理下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("臨時(shí)文件目錄清理完成")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 實(shí)現(xiàn)數(shù)據(jù)庫(kù)更新腳本的生成方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 陈巴尔虎旗| 衡山县| 陕西省| 韶关市| 芒康县| 五河县| 库车县| 南部县| 乡城县| 伊春市| 玛沁县| 凉城县| 丹江口市| 南宫市| 洛宁县| 措美县| 高陵县| 洛隆县| 汾阳市| 涟水县| 上虞市| 九江县| 尚志市| 锡林浩特市| 桦南县| 乐东| 绿春县| 郧西县| 玉山县| 涞源县| 神木县| 沂南县| 福泉市| 岱山县| 天峻县| 杭州市| 商城县| 宁阳县| 鲁山县| 呼伦贝尔市| 横山县|