資料庫高階實踐 事件監聽

2022-06-11 05:15:08 字數 2403 閱讀 6803

事件監聽

在flask中,我們可以使用flask提供的過個裝飾器註冊請求**函式,他們會在特定的請求處理環節被執行。類似的,sqlalchemy也提供了乙個listen_for()裝飾器,他可以用來註冊時間**函式。

我們建立乙個draft模型類表示草稿,其中包含body欄位和edit_tine欄位,分別儲存草稿正文和被修改的次數,其中edit_time欄位的預設值為0,如下所示:

class

draft(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....