為實現python對sql指令碼的自動化呼叫或批量執行,讀取指令碼內容自然是第一步,也是關鍵所在
規範化的sql指令碼是我們的最愛,**處理也最為簡單,如網文《20行python**執行sql檔案》、《python執行sql指令碼》
等但是!
sql指令碼檔案內容如果包含人為的、手寫
、不規範的、多種備註方式的情況,該怎麼處理呢?
以mysql為例,備註內容的書寫方式就有好幾種,如下:
# 備註方式1
-- 備註方式2
/*備註方式3
*/select * from dual; # 備註方式4
select * from dual; -- 備註方式5
參考資料
《mysql指令碼注釋使用》
《python逐行讀檔案的三種方法》
如下方法實現mysql指令碼檔案的讀取,包含了對備註內容的處理,入參path 是指令碼檔案的絕對路徑,出參為 sql語句的字串列表
def readsqlfile(path):
f = open(path, "r", encoding="utf-8")
lines = f.readlines()
sqllist =
thissql = ""
mulnote = false
for line in lines:
string = str(line).strip()
if string == "":
continue
# part1 multi-line comment
if mulnote:
if string.startswith("*/"):
mulnote = false
continue
if string.startswith("/*"):
mulnote = true
continue
if string.startswith("#") or string.startswith("--"):
continue
strin1 = false
strin2 = false
for i in range(len(string)):
c = string[i]
# part2 string in sql
if "'" == c:
if not strin1:
strin1 = true
else:
strin1 = false
continue
if '"' == c:
if not strin2:
strin2 = true
else:
strin2 = false
continue
if strin1 is true and strin2:
continue
# part3 end of sql
if ";" == c:
string = string[0:(i + 1)]
break
# part4 comment behind of the sql
if "#" == c:
string = string[0:i]
break
if "-" == c and i <= len(string) - 2 \
and "-" == string[i + 1]:
string = string[0:i]
break
# part5 join multi-line for one sql
thissql += " " + string
# part6 end of sql
if string.endswith(";"):
thissql = ""
return sqllist
linux指令碼實現excel檔案內容讀取到資料庫
假設我現在有乙個表,需要插入excel的資料 建立表的 如下 create table student sid varchar 10 sname varchar 20 sgender char 1 sage int 現在要從excel匯入資料 首先我們可以把資料轉化成csv或者txt,這裡我用csv...
Python指令碼批量生成SQL語句
通過python指令碼批量生成插入資料的sql語句 原始sql語句 insert into system user id,login name,name,password,salt,code,createtime,email,main org,positions,status,used,url,in...
python指令碼實現檔案備份
本指令碼通過判斷是否為周一來執行完全備份或增量備份,需提前放到計畫任務中每天執行,實現周一完全備份,之後每天增量備份的功能.具體 實現如下 root bin python from time import strftime import os import tarfile import hashli...