事件監聽
在flask中,我們可以使用flask提供的過個裝飾器註冊請求**函式,他們會在特定的請求處理環節被執行。類似的,sqlalchemy也提供了乙個listen_for()裝飾器,他可以用來註冊時間**函式。
我們建立乙個draft模型類表示草稿,其中包含body欄位和edit_tine欄位,分別儲存草稿正文和被修改的次數,其中edit_time欄位的預設值為0,如下所示:
classdraft(db.model):
id = db.column(db.integer, primary_key =true)
body =db.column(db.text)
edit_time = db.column(db.integer, default = 0)
通過註冊事件監聽甘薯,我們可以實現在body列修改時,自動疊加表示被修改次數的edit_time欄位。在sqlalchemy中,每個事件都會有乙個對應的事件方法,不同的事件方法支援不同的引數。被註冊的監聽函式需要接收對應事件方法的所有引數,所以具體的監聽函式用法因使用的事件而異。設定某個字段值將處罰set事件。
@db.event.listens_for(draft.body, 'set'
)def
increment_edit_time(target, value, oldvalue, initiator):
if target.edit_time is
notnone:
target.edit_time += 1
我們在listen_for()裝飾器中分別傳入draft.body和set作為target和identifier引數的值,監聽函式接收所有set()事件方法接收的引數,其中的target引數表示觸發時間的模型類例項,使用target.edit_time即可獲取我們需要疊加的字段。其他的引數也需要照常寫出,雖然這裡沒有用到。value表示被設定的值,oldvalue表示被取代的舊值。
當set事件發生在目標物件draft.body上時,這個監聽函式就會被執行,從而自動疊加draft.edit_time列的值,如下所示:
>>> draft = draft(body = 'init')
>>>db.session.add(draft)
>>>db.session.commit()
>>>draft.edit_time
0>>>draft.bodyu'
init
'>>> draft.body = '
edited
'>>>draft.edit_time
1>>> draft.body = '
edited again
'>>>draft.edit_time
2>>> draft.body = '
edited again again
'>>>draft.edit_time
3>>> db.session.commit()
除了這種傳統的引數接收方式,即接收所有事件方法接收的引數,還有一種更簡單的方法。通過在listen_for()裝飾器中將關鍵字引數name設為true,可以在監聽函式中接收**kwargs作為引數(可變長關鍵字引數), 即「named argument」(命名引數)。然後在函式中可以使用引數名作為鍵來從**kwargs字典獲取對應的引數值:
@db.event.listens_for(draft.body, 'set', named =true)
def increment_edit_time(**kwargs):
if kwargs['
target
'].edit_time is
notnone:
kwargs[
'target
'].edit_time += 1
>>> draft =draft.query.first()
>>>draft
>>>draft.bodyu'
edited again again
'>>>draft.edit_time
3>>> draft.body = '
edited 3 times
'>>>draft.edit_time
4
sqlalchemy作為sql工具基本身包含兩大主要元件:sqlalchemy orm和sqlalchemy core。前者實現了orm功能,後者實現了資料庫介面等核心功能,這兩類元件都提供了大量的監聽事件,幾乎覆蓋了sqlalchemy使用的宣告週期。
除了使用listen_for裝飾器,我們還可以直接使用它內部呼叫的listen()函式註冊事件監聽函式,第三個引數傳入被註冊的函式物件,比如db.event.listen(someclass, 『load』, my_load_listener)。
資料庫實踐
1.資料庫學習筆記 如果把python 和資料庫比作兩個不同的地點,connection 就是路,能連線python和database。cursor就像在路上行駛的小貨車,可以用於執行sql 語句,以及儲存sql 執行的結果 序號api 描述 1sqlite3.connect database ti...
mysql資料庫高階 mysql資料庫高階
一 索引 索引,是資料庫中專門用於幫助使用者快速查詢資料的一種資料結構。類似於字典中的目錄,查詢字典內容時可以根據目錄查詢到資料的存放位置,然後直接獲取即可。分類 普通索引 唯一索引 全文索引 組合索引 主鍵索引 1 普通索引 普通索引僅有乙個功能 加速查詢 建立表時建立索引 create tabl...
redis 高階功能,過期事件監聽
不談應用場景的技術都是道聽途說 這個問題解決的方案就有多種了,我們可以通過mq來進行,現在大多的mq都帶有死信佇列的機制,我們可以通過這個機制來完成,其次也可以通過quartz的輪詢方式的完成,過程不表選擇合適的應對當前的需求即可。當然本次主要是解決第乙個需求,所以只談如何使用redis來解決。3....