Sqlalchemy 事件監聽與初始化

2022-06-27 22:33:11 字數 2705 閱讀 9714

sqlalchemy不僅僅能自動建立資料庫,更提供了其他更強大的功能,今天要介紹的就是sqlalchemy中的事件監聽,並將其應用到資料庫的初始化中。

需求:當插入設定password欄位時,自動加密

# -*- coding:utf-8 -*-

from sqlalchemy import *

from sqlalchemy import event

from

sqlalchemy.ext.declarative import declarative_base

from

sqlalchemy.orm import scoped_session, sessionmaker

import hashlib

#這裡定義乙個password加密混淆

password_prefix = "

ad%cvcsadefr^!deaf

"#定義資料庫的賬號、埠、密碼、資料庫名,使用的連線模組,這裡用的是mysqldb

engine =create_engine(

'mysql+mysqldb://root:1234567@localhost:3306/tech?charset=utf8',

echo=false#是否輸出資料庫操作過程,很方便除錯

)#定義乙個函式,用來獲取sqlalchemy的session

def bindsql():

return scoped_session(sessionmaker(bind=engine))

base =declarative_base()

base.__table_args__ = #定義資料表使用innodb

class

user(base):

__tablename__ = "

user

"id = column(integer, primary_key=true)

name = column(string(20), unique=true)

email = column(string(32), unique=true)

password = column(string(32

)) superuser = column(boolean, default=false)

metadata =base.metadata

#定義乙個**函式用於響應觸發事件

def setpassword(target, value, oldvalue, initiator):

if value ==oldvalue:#如果新設定的值與原有的值相等,那麼說明使用者並沒有修改密碼,返回原先的值

return

oldvalue

#如果新值與舊值不同,說明密碼發生改變,進行加密,加密方法可以根據自己需求改變

return hashlib.md5("

%s%s

" %(password_prefix, value)).hexdigest()

#設定事件監聽,

event

.listen(表單或表單字段, 觸發事件, **函式, 是否改變插入值)

event.listen(user.password, "

set", setpassword, retval=true)

#為了避免重複插入資料,定義乙個get_or_create函式,這個是模仿django的,有興趣的同學可以google下

def get_or_create(session, model, **kwargs):

if"defaults"in

kwargs:

defaults = kwargs["

defaults"]

del kwargs[

"defaults"]

else

: defaults ={}

instance = session.query(model).filter_by(**kwargs).first()

ifinstance:

return

instance, false

else

: kwargs.update(defaults)

instance = model(**kwargs)

session.add(instance)

session.flush()

session.refresh(instance)

return

instance, true

#定義初始化函式

def initmodel():

metadata.create_all(engine)#建立資料庫

db =bindsql()#獲取sqlalchemy的session

#建立超級管理員,這裡為了避免多次執行initmodel而發生重複插入的情況,使用了get_or_create方法

obj, created =get_or_create(

db,user,

name="

administrator",

defaults=

)db.commit()#記得commit喔,不然資料最後還是沒插入

db.remove()

if __name__ == "

__main__":

initmodel()

直接執行:

python models.py

事件的監聽與廣播

建立指令碼eventtype,列舉型別,存放鍵值。public enum enventtype 建立指令碼eventcenter,eventtype就是建立的列舉型別,表示鍵,後面的delegate為值,要引入命名空間system。using system.collections using sys...

spring 事件監聽

用乙個簡單的例子來實現spring事件監聽的功能 這個例子主要功能是,記錄那些使用者是第一次登入系統,如果使用者是第一次登入系統,則呼叫spring的事件監聽,記錄這些使用者。主要用到的spring的類和介面有 這兩者構成了觀察者模式 observer 下面讓我們來看下實現 private stri...

Redis 事件監聽

需求 要統計乙個頁面的訪問人數,如果訪問量大時,頻繁讀寫資料庫,而且操作的是同乙個資料,可能會對效能造成影響。解決 把資料放在快取中,定期和資料庫同步,設定容器關閉 關閉容器前,將資料同步到資料庫。現在系統中快取用的是redis。redis一般的應用是提供查詢效率,很少更新,更新也是直接更新資料庫,...