python實現一次性封裝多條sql語句(begin end)
python封裝利用begin end執行多條sql
因為業務需求,優化模型執行時間。考慮到sql語句每一次執行都要建立連線,查詢,獲取資料耗時過多。就想到將sql一起提交上去執行,能夠節省很多時間。原本1.6-2.5秒耗時的sql語句經過修改後時間降到0.3-0.6秒,感覺效能提升挺好的。
當然還有一種想法,如果有python框架的orm可能會更快,相比來說耗時基本看不到了吧,這只是我的猜想,僅僅為了優化一個模型寫一個框架的話 程式碼可能需要改的比較多,自我感覺付出和收穫不一定會成正比,當然以後有時間可以試試。
這次優化基本程式碼邏輯沒有動,利用了begin end進行sql整合。
公司用的是oracle,之前沒用過但是感覺和mysql基本類似,如果是mysql的話該方法也可用
sql_str = ‘begin\n'
sql_str += ‘這裡時需要執行的sql語句'
sql_str += ‘\ncommit;end;'
中間sql有多少條無所謂,看了一下執行時間感覺 我的一千行sql耗時 幾乎就是這一千行裡面耗時最長那個時間。是非同步完成還是什麼這個就不是很清楚了,主要是一次建立連線,省去網路傳輸資料和請求資料庫的過程
網上好多begin end都是在視覺化工具中的sql執行的,並不能在command中執行,這就意味中我們程式碼中封裝的語句沒有卵用,還好沒放棄當時就研究了一下找到了解決辦法
在end 提交一下就ok了,如果在command中執行一直未結束的話加一個 / 斜線就ok了
本次內容就此結束,下面是一些題外話。
在說一個其中遇到的問題吧,在進行sql封裝後,其中很多表都很亂,約束很亂 而且邏輯並不嚴謹,但是模型正在執行還不讓動 那隻能按照這個規則來了
ORA 00001 違反唯一約束條件 其中出現了這個問題,意思就是唯一約束重複了,因為模型輸入問題,處理出來的結果之前可能剛插入到資料庫中(也就是 上面的sql_str 出現了兩天相同的insert),這個東西很簡單,加一個set判斷一下就行,但是到這之後,一個bug就跳出來了,這個指令碼計算的是因子重要度,結果預測可能每次都不相同,有些資料很小的可能就當成0扔進去了,所以我需要做的是將 相同資料的情況下插入較為重要的因子重要度(也無需要 ),這樣的話簡簡單單的set就不行了,但是也不難 用來一下字典
importance_map = {} 實現建立好字典 if feature in importance_map: if importance_map[feature] < importance: sql_str +=‘***************‘'' 這裡就是insert語句了 else: continue else: importance_map[feature] = importance
其實這個東西也沒有什麼難點,但是做到這之後就有很多想法折射出來。
資料處理原本也可以用pandas進行,但是pandas是對所有資料進行操作,我一個set只對重複資料進行操作,切pandas記憶體消耗極為嚴重,前兩天寫的特徵工程記憶體炸裂。表資料用完後記憶體並沒有得到釋放,這裡面就涉及到python的垃圾回收,用法至今沒有搞懂,還需要研究研究,gc是對迴圈引用進行垃圾回收,記憶體釋放。但是這個pandas並不是迴圈引用,我認為是在儲存在快取區中,位置佔死了,就很煩
模型畢竟是在伺服器上面跑,儘量快切省記憶體,不然你把記憶體佔了 別人的專案怎麼玩。所以就用這種方法。
很少寫部落格,主要是記錄一下問題以後 再出現了好應對。當然如果能夠幫助正在修復bug中的你,也是樂意至極。那塊說的有問題或者解釋不清楚,可以留言。
補充知識:postgreSQL sql使用 %s時務必加引號,即為‘%s',否則報錯
postgre sql使用 %s時務必加引號,即為‘%s',否則報錯
if name == ‘main':
t="TDD-LTE_MRO" sql="select * from lastftp where enbid = %d and keytype = %s"%(110001,t) print(selectOperate(sql))
結果:
Traceback (most recent call last): File “/home/eyann/mypython/t1/pgSQLoperate.py”,line 84,in print(selectOperate(sql)) File “/home/eyann/mypython/t1/pgSQLoperate.py”,line 45,in selectOperate cursor.execute(sql) psycopg2.ProgrammingError: column “tdd” does not exist LINE 1: …* from lastftp where enbid = 110001 and keytype = TDD-LTE_MR… ^
if name == ‘main':
t="TDD-LTE_MRO" sql="select * from lastftp where enbid = %d and keytype = '%s'"%(110001,t) print(selectOperate(sql))
結果:
[(‘test3',‘TDD-LTE_MRO',‘0114123000',‘0012',110001)]
[Finished in 0.1s]
以上這篇python實現一次性封裝多條sql語句(begin end)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。