最近因為要提公升產品效率,不得不蹚了蹚mysql儲存過程的水.只能說水不算深,效果也很棒.在這裡做個記錄,免得忘了.
1. python呼叫儲存過程的方式
sqlalchemy的session是可以直接呼叫的.因為session本身封裝了個資料庫回話,底層其實也是呼叫的依賴的資料庫殷勤的方法.所以可以直接以execute的方式去呼叫儲存過程
session.execute("call procedure_name(param1, param2, ..., param_return);")
但是! 這種呼叫方式有坑.通過我的實際驗證,現象是當儲存過程較為複雜,消耗較大記憶體時,這種呼叫方式容易造成記憶體的占用居高不下~因為時間比較緊,具體原因還沒有搞清楚.
推薦直接使用資料庫引擎方法去呼叫.
args = (param1, param2, ..., param_return)
res = cursor.callproc('procedure_name', args)
# res即為args中傳入的引數,
# 真正的返回值為傳入的儲存過程 out 引數, 會在儲存過程內賦值, 以下標獲取即可
2. mysql的xml方法
mysql解析xml只有倆方法, extractvalue(xml, xpath)和updatexml(xml, xpath, new_xml). 獲取xml的屬性主要依靠 extractvalue方法.但是該方法只能獲取xml的屬性值,就是說想要獲取xml的某些片段,只能依賴mysql的字串方法,比如substring_index(),拼接字串方法concat()等等.
我們常見的場景比如判斷xml中有無某個key, extractvalue也是不支援的,會直接返回空字串讓人摸不著頭腦.可以用於判斷key是否存在的方法有使用正則匹配regexp
select @xml regexp 'key_name';
字串方法instr(str, sub_str)
select instr(@xml, 'key_name');
字串方法locate(str, sub+str)
select locate(@xml, 'key_name');
以上三種方法都是可以的,在1m左右大小的xml時,regexp的匹配時間是60ms左右, instr的時間在10ms以上,而locate的則穩定在個位毫秒數.所以推薦使用locate方法.
updatexml是用於替換xml片段的,比如......某些沒用的片段,可以直接替換成空字串~
此外, 有幾個坑要避免,
<1>. 當xml非常大的時候, 解析速度會變慢.解決辦法是提前拆好~
<2>. 當xml非常大的時候,不要嘗試去用replace全域性替換某個字元或者標籤.比如xml的namespace啥的,慢到令人窒息!解決方法,用et提前替換好......
附上mysql xml function 文件
附上mysql string function 文件
3. mysql的json方法
mysql對json的支援比xml好一萬倍!
附上mysql json function 文件
通過這些方法,可以在儲存過程裡使用列表和字典~對絕大多數的應用程式設計師來說是一件很開心的事兒了.
最後!為啥這玩意這麼麻煩還要去搞.因為使用儲存過程可以極大的減少資料庫互動次數,而且sql效率本身強於一切orm,而儲存過程是編譯過得sql.你品,你細品!總結,合格的程式設計師還是需要會寫一首sql的.
mysql儲存過程now mysql儲存過程
建立清除過期積分儲存過程 delimiter drop procedure if exists reporturl create procedure reporturl begin 定義變數 declare s int default 0 declare sum integral varchar 2...
mysql 分號 儲存過程 Mysql之儲存過程
1.進入到資料庫中檢視 是否有相關的儲存過程資料 show procedure status where db test 2.建立簡單的儲存過程 create procedure hi select hello 3.呼叫儲存過程 call hi 事例 三 mysql 儲存過程特點 建立 mysql ...
mysql怎麼建儲存過程 mysql儲存過程怎麼寫
mysql 儲存過程是一些 sql 語句的集合,比如有的時候我們可能需要一大串的 sql 語句,或者說在編寫 sql 語句的過程中還需要設定一些變數的值,這個時候我們就完全有必要編寫乙個儲存過程。下面我們來介紹一下如何建立乙個儲存過程。語法格式 可以使用 create procedure 語句建立儲...