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一般的應用是提供查詢效率,很少更新,更新也是直接更新資料庫,...