欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年07月09日 14:11:16   作者:rcddup  
當我們需要準備更新腳本的使用,不小心會忘記改動了哪里,所以小編試著用Python來實現(xiàn)自動的生成更新腳本,具體操作方法,大家參考下本文吧

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

  主要操作如下:

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

def select_database_struts(self):
  '''
  查找當前連接配置中的數(shù)據庫結構以字典集合
  '''
  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腳本

'''
數(shù)據庫遷移腳本, 目前支持一下幾種功能:
1.生成舊數(shù)據庫中沒有的數(shù)據庫表執(zhí)行 SQL 腳本(支持是否帶表數(shù)據),生成的 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, 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 舊數(shù)據庫(目標數(shù)據庫)
 @new 最新的數(shù)據庫(源數(shù)據庫)
 @has_data 是否生成結構+數(shù)據的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():
 '''
 每次執(zhí)行的時候調用這個,先清理下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 實現(xiàn)數(shù)據庫(SQL)更新腳本的生成方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

相關文章

  • Python實現(xiàn)冒泡排序的簡單應用示例

    Python實現(xiàn)冒泡排序的簡單應用示例

    這篇文章主要介紹了Python實現(xiàn)冒泡排序的簡單應用,結合實例形式分析了Python基于冒泡排序實現(xiàn)的輸入字符串數(shù)字排序與運算操作,需要的朋友可以參考下
    2017-12-12
  • OpenCV半小時掌握基本操作之直方圖

    OpenCV半小時掌握基本操作之直方圖

    這篇文章主要介紹了OpenCV基本操作之直方圖,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Python協(xié)程的2種實現(xiàn)方式分享

    Python協(xié)程的2種實現(xiàn)方式分享

    在?Python?中,協(xié)程(Coroutine)是一種輕量級的并發(fā)編程方式,可以通過協(xié)作式多任務來實現(xiàn)高效的并發(fā)執(zhí)行。本文主要介紹了Python實現(xiàn)協(xié)程的2種方式,希望對大家有所幫助
    2023-04-04
  • typing.Dict和Dict的區(qū)別及它們在Python中的用途小結

    typing.Dict和Dict的區(qū)別及它們在Python中的用途小結

    當在 Python 函數(shù)中聲明一個 dictionary 作為參數(shù)時,我們一般會把 key 和 value 的數(shù)據類型聲明為全局變量,而不是局部變量。,這篇文章主要介紹了typing.Dict和Dict的區(qū)別及它們在Python中的用途小結,需要的朋友可以參考下
    2023-06-06
  • Python中循環(huán)后使用list.append()數(shù)據被覆蓋問題的解決

    Python中循環(huán)后使用list.append()數(shù)據被覆蓋問題的解決

    這篇文章主要給大家介紹了關于Python中循環(huán)后使用list.append()數(shù)據被覆蓋問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • PyTorch之torch.matmul函數(shù)的使用及說明

    PyTorch之torch.matmul函數(shù)的使用及說明

    PyTorch的torch.matmul是一個強大的矩陣乘法函數(shù),支持不同維度張量的乘法運算,包括廣播機制。提供了矩陣乘法的語法,參數(shù)說明,以及使用示例,幫助理解其應用方式和乘法規(guī)則
    2024-09-09
  • python3.4用函數(shù)操作mysql5.7數(shù)據庫

    python3.4用函數(shù)操作mysql5.7數(shù)據庫

    這篇文章主要為大家詳細介紹了python3.4用函數(shù)操作mysql5.7數(shù)據庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Python實現(xiàn)層次分析法及自調節(jié)層次分析法的示例

    Python實現(xiàn)層次分析法及自調節(jié)層次分析法的示例

    這篇文章主要介紹了Python實現(xiàn)層次分析法及自調節(jié)層次分析法的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 使用Python編寫提取日志中的中文的腳本的方法

    使用Python編寫提取日志中的中文的腳本的方法

    這篇文章主要介紹了使用Python編寫提取日志中的中文的腳本的方法,該腳本包括過濾重復的字符行等功能,需要的朋友可以參考下
    2015-04-04
  • python根據經緯度計算距離示例

    python根據經緯度計算距離示例

    這篇文章主要介紹了python根據經緯度計算距離示例, 計算兩點之間距離,需要的朋友可以參考下
    2014-02-02

最新評論