python實現(xiàn)一次性封裝多條sql語句(begin end)
python封裝利用begin end執(zhí)行多條sql
因為業(yè)務(wù)需求,優(yōu)化模型運行時間。考慮到sql語句每一次執(zhí)行都要建立連接,查詢,獲取數(shù)據(jù)耗時過多。就想到將sql一起提交上去運行,能夠節(jié)省很多時間。原本1.6-2.5秒耗時的sql語句經(jīng)過修改后時間降到0.3-0.6秒,感覺性能提升挺好的。
當然還有一種想法,如果有python框架的orm可能會更快,相比來說耗時基本看不到了吧,這只是我的猜想,僅僅為了優(yōu)化一個模型寫一個框架的話 代碼可能需要改的比較多,自我感覺付出和收獲不一定會成正比,當然以后有時間可以試試。
這次優(yōu)化基本代碼邏輯沒有動,利用了begin end進行sql整合。
公司用的是oracle,之前沒用過但是感覺和mysql基本類似,如果是mysql的話該方法也可用
sql_str = ‘begin\n'
sql_str += ‘這里時需要執(zhí)行的sql語句'
sql_str += ‘\ncommit;end;'
中間sql有多少條無所謂,看了一下運行時間感覺 我的一千行sql耗時 幾乎就是這一千行里面耗時最長那個時間。是異步完成還是什么這個就不是很清楚了,主要是一次建立連接,省去網(wǎng)絡(luò)傳輸數(shù)據(jù)和請求數(shù)據(jù)庫的過程
網(wǎng)上好多begin end都是在可視化工具中的sql執(zhí)行的,并不能在command中執(zhí)行,這就意味中我們代碼中封裝的語句沒有卵用,還好沒放棄當時就研究了一下找到了解決辦法
在end 提交一下就ok了,如果在command中運行一直未結(jié)束的話加一個 / 斜線就ok了
本次內(nèi)容就此結(jié)束,下面是一些題外話。
在說一個其中遇到的問題吧,在進行sql封裝后,其中很多表都很亂,約束很亂 而且邏輯并不嚴謹,但是模型正在運行還不讓動 那只能按照這個規(guī)則來了
ORA 00001 違反唯一約束條件 其中出現(xiàn)了這個問題,意思就是唯一約束重復了,因為模型輸入問題,處理出來的結(jié)果之前可能剛插入到數(shù)據(jù)庫中(也就是 上面的sql_str 出現(xiàn)了兩天相同的insert),這個東西很簡單,加一個set判斷一下就行,但是到這之后,一個bug就跳出來了,這個腳本計算的是因子重要度,結(jié)果預(yù)測可能每次都不相同,有些數(shù)據(jù)很小的可能就當成0扔進去了,所以我需要做的是將 相同數(shù)據(jù)的情況下插入較為重要的因子重要度(也無需要 ),這樣的話簡簡單單的set就不行了,但是也不難 用來一下字典
importance_map = {} 實現(xiàn)創(chuàng)建好字典 if feature in importance_map: if importance_map[feature] < importance: sql_str +=‘***************‘'' 這里就是insert語句了 else: continue else: importance_map[feature] = importance
其實這個東西也沒有什么難點,但是做到這之后就有很多想法折射出來。
數(shù)據(jù)處理原本也可以用pandas進行,但是pandas是對所有數(shù)據(jù)進行操作,我一個set只對重復數(shù)據(jù)進行操作,切pandas內(nèi)存消耗極為嚴重,前兩天寫的特征工程內(nèi)存炸裂。表數(shù)據(jù)用完后內(nèi)存并沒有得到釋放,這里面就涉及到python的垃圾回收,用法至今沒有搞懂,還需要研究研究,gc是對循環(huán)引用進行垃圾回收,內(nèi)存釋放。但是這個pandas并不是循環(huán)引用,我認為是在存儲在緩存區(qū)中,位置占死了,就很煩
模型畢竟是在服務(wù)器上面跑,盡量快切省內(nèi)存,不然你把內(nèi)存占了 別人的項目怎么玩。所以就用這種方法。
很少寫博客,主要是記錄一下問題以后 再出現(xiàn)了好應(yīng)對。當然如果能夠幫助正在修復bug中的你,也是樂意至極。那塊說的有問題或者解釋不清楚,可以留言。
補充知識:postgreSQL sql使用 %s時務(wù)必加引號,即為‘%s',否則報錯
postgre sql使用 %s時務(wù)必加引號,即為‘%s',否則報錯
if name == ‘main':
t="TDD-LTE_MRO" sql="select * from lastftp where enbid = %d and keytype = %s"%(110001,t) print(selectOperate(sql))
結(jié)果:
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))
結(jié)果:
[(‘test3', ‘TDD-LTE_MRO', ‘0114123000', ‘0012', 110001)]
[Finished in 0.1s]
以上這篇python實現(xiàn)一次性封裝多條sql語句(begin end)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Pytorch損失函數(shù)torch.nn.NLLLoss()的使用
這篇文章主要介紹了Pytorch損失函數(shù)torch.nn.NLLLoss()的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02python spilt()分隔字符串的實現(xiàn)示例
split() 方法可以實現(xiàn)將一個字符串按照指定的分隔符切分成多個子串,本文介紹了spilt的具體使用,感興趣的可以了解一下2021-05-05python使用多線程查詢數(shù)據(jù)庫的實現(xiàn)示例
這篇文章主要介紹了python使用多線程查詢數(shù)據(jù)庫的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08Python3實現(xiàn)爬取簡書首頁文章標題和文章鏈接的方法【測試可用】
這篇文章主要介紹了Python3實現(xiàn)爬取簡書首頁文章標題和文章鏈接的方法,結(jié)合實例形式分析了Python3基于urllib及bs4庫針對簡書網(wǎng)進行文章抓取相關(guān)操作技巧,需要的朋友可以參考下2018-12-12Python 計算機視覺編程進階之OpenCV 進行霍夫變換
霍夫變換(Hough)是一個非常重要的檢測間斷點邊界形狀的方法。它通過將圖像坐標空間變換到參數(shù)空間,來實現(xiàn)直線與曲線的擬合,通過本篇文章我們來詳細了解它2021-11-11Python+Matplotlib繪制帶有對角線的散點圖的示例代碼
Matplotlib 是一個用于繪制二維圖形的 Python 庫,這篇文章主要介紹了Python如何利用Matplotlib繪制帶有對角線的散點圖,需要的小伙伴可以參考一下2023-06-06