基於Python實現自動拉取Git分支源碼自動解析並執行SQL語句
by:授客 QQ:1033553122
1.代碼用途
開發過程中,研發人員會提交SQL更新腳本到Git源碼庫,然后測試負責去拉取這些SQL腳本,並手動在測試環境或其它環境的數據庫中執行這些腳本,很麻煩,本代碼的用途就是為了替代手工執行的操作
2.測試環境
Win7 64位
Python 3.3.2
git-credential-winstore.exe
下載地址:
https://pan.baidu.com/s/1hsehGjU
mysql-connector-python-2.1.4-py3.3-winx64.msi
下載地址:http://pan.baidu.com/s/1cDtP1O
官方下載地址:http://dev.mysql.com/downloads/connector/python/
Git-2.13.1.2-64-bit.exe
TortoiseGit-1.8.14.0-64bit.msi
atlassian-bitbucket-5.1.1-x64.exe
3.設計思路
大致思路如下:
->> 1-1 如果是首次運行程序,創建基線文件和基線變量,遞歸遍歷本地目標目錄下的SQL文件,然后根據待執行SQL文件所屬數據庫(例中為ddtm|ddtmk)和操作類型(例中為更新|回滾),分別記錄到不同的基線文件,同時也記錄到對應的基線變量中
->> 1-2 如果非首次運行程序,從基線文件讀取已執行過的文件到對應的基線變量
->> 2 切換到本地目標分支
->> 3 PULL Git遠程分支merge到本地目標分支
->> 4 遞歸遍歷本地目標目錄下的SQL文件,然后根據待執行SQL文件所屬數據庫和操作類型,分別記錄到不同非基線變量
->> 5 對比基線變量和非基線變量,過濾得出待執行的SQL腳本文件,根據所屬數據庫和操作類型,分別存入不同變量
->> 6 按操作順序執行這些變量中的SQL腳本(先執行更新,再執行回滾,再執行更新)
6.1 針對每個變量,排序好SQL文件(例中為按文件名),接着按排序后的順序,解析每個SQL文件
6.1.1 針對每個SQL文件,先解析得到單個文件中所有待執行SQL語句,並按文件中SQL語句編寫順序存儲,然后執行每條SQL語句,根據執行結果分別記錄結果到不同的文件
6.1.2 等待單個SQL文件中的SQL都執行完成,更新該文件信息至對應的基線文件
4.使用方法
1) 安裝好相關軟件,特別是git-credential-winstore.exe
安裝好該軟件后,手動執行一次Git PULL操作,目的在於存儲憑據,以便后續執行Git相關操作時,免輸入密碼操作
2)配置程序用數據庫
編輯配置文件conf/dbconfig.conf
[DDTM]
host = 192.168.1.100
port = 3306
user = testacc
passwd = test1234
db = ddtm
charset = utf8
[DDTMK]
host = 192.168.1.100
port = 3306
user = testacc
passwd = test1234
db = ddtmk
charset = utf8
3)配置需要遍歷的目標目錄(SQL文件所在目錄)
編輯配置文件conf/dirpath_init.conf
[INITCONF]
dir_path = E:\Git\ddt-core-ws\ddt-db\db\V6.8
4)git初始化配置
編輯配置文件conf/git_init.conf
[INITCONF]
git_remote_hostname = origin
remote_branchs_to_pull = ['master']
local_branch = master
path_to_local_branch = E:/Git/ddt-core-ws
說明:
git_remote_hostname: 遠程主機名稱
remote_branchs_to_pull: 需要拉取的遠程分支,格式為列表形式,形如['master', 'feature/V1.1']
local_branch:需要切到至的本地目標分支,要求必須已在本地經創建該分支
path_to_local_branch:本地分支源碼所在路徑,依葫蘆畫瓢 ,注意用 /分隔
5)執行程序
推薦寫成批處理,然后用windows定時任務跑,如下
cd /d D:\auto_exec_sql
python main.py
start D:\auto_exec_sql\filerecord\file_for_failure.txt
說明:
start D:\auto_exec_sql\filerecord\file_for_failure.txt
該命令用於執行完畢后自動打開存放執行SQL失敗的文件,方便查看
每條sql語句執行結果包含以下幾個方面
執行的sql
執行時間
所在的文件(全路徑)
操作的數據庫
執行失敗的原因
注意:
<1> 每次允許程序,執行成功、失敗的記錄都會分別追加到file_for_failure.txt,file_for_success.txt,為了方便查看執行結果,建議適時清空file_for_failure.txt內容。(為何不以’w’方式打開呢?如果是定時任務跑,中途某次運行結果忘記查看了,那豈不是會因為覆蓋,無法查詢那次的執行結果?)
<2> 正常情況下,每次運行完成后,無更新的情況下,每個已執行過的文件都不會在下次運行中被執行,需要人工查看失敗原因,並手工補充執行操作
<3> 如果想目標目錄下的文件都被重新執行一次,則程序運行之前,手動放置四個空文件到filerecord目錄下
5.源碼下載地址
https://pan.baidu.com/s/1c1ObC9y
6.說明
本程序非通用程序,僅提供思路,針對不同項目,需要做適當的修改,方可用
程序使用限制如下
<1> 固定的目錄組織結構,存放SQL文件的上級目錄,及上級目錄的父目錄結構及名稱,必須和以下一模一樣,否則必須修改程序
<2> 腳本文件命名,必須數字打頭,代表文件新增順序,同時也代表其SQL語句執行順序,如果目標目錄包含了多個帶 <1>結構的文檔目錄,那么要求每個SQL腳本的編號唯一,或者按名稱升序排序能代表文件執行順序
<3> 統一SQL腳本文件編碼,暫時不支持不同編碼的文件同時存在,目前定性為UTF-8-SIG(UTF-8無BOM格式編碼)
<4> 不支持創建mysql存儲過程,事件等,這類以DELIMITER //開頭,以DELIMITER ;結尾的SQL語句
<5> 存儲過程,事件等除外,其它普通SQL,每條SQL語句之間必須以 ; 分號分隔
<6> 程序根據文件名稱&文件最后修改時間組合值是否變化來判斷文件是否被更新,是則會被執行
源碼下載
程序重構:
自動感知新分支並自動拉去,自動切換到新目錄進行腳本執行,支持不改代碼,動態增加數據庫
[授客]基於Python實現自動拉取Git分支源碼自動解析並執行SQL語句20170821