Sqlalchemy 事件监听与初始化
sqlalchemy不仅仅能自动创建数据库,更提供了其他更强大的功能,今天要介绍的就是sqlalchemy中的事件监听,并将其应用到数据库的初始化中。
需求:当插入设置password字段时,自动加密
- # -*- coding:utf- -*-
- 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__ = {'mysql_engine':'InnoDB'}#定义数据表使用InnoDB
- class User(Base):
- __tablename__ = "user"
- id = Column(Integer, primary_key=True)
- name = Column(String(), unique=True)
- email = Column(String(), unique=True)
- password = Column(String())
- 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()
- if instance:
- 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={
- "email": "332535694@qq.com",
- "password": "administrator",
- "superuser": True
- }
- )
- db.commit()#记得commit喔,不然数据最后还是没插入
- db.remove()
- if __name__ == "__main__":
- initModel()
直接运行:
python models.py
Sqlalchemy 事件监听与初始化的更多相关文章
- 关于vue事件监听的一个问题
由于新工作需要用vue,所以最近接触最多的也是vue,因为之前一直在用react,所以对于vue上手还是很快的.我也尽量找一些他们两个的异同点,除了多了一些辅助用的方法以外,最大的不同应该是对于组件间 ...
- Java中用得比较顺手的事件监听
第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...
- android开发事件监听
第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...
- 事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener
本版本为1.0,支持较少,使用不够方便.相关封装逻辑结构已升级至2.0,详情可参见:更完善的安卓事件监听实现 先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机 ...
- tomcat的事件监听
//事件涉及的三个组件:事件源.事件对象.事件监听器 //一个总的事件监听器接口,所有不同分类的事件监听器都继承这个接口 public interface EventListener {} //例如 ...
- [问题贴]mui.openWindow+自定义事件监听操作让alert()执行两次
仔细看,Alert函数执行了两次 共两个页面:index.html和detail.html, detail.html为按钮设置了自定义事件监听(newsId),触发alert. 在index.html ...
- Java中的事件监听机制
鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...
- 百度编辑器的内容改变事件监听bug
先贴上我的初始化代码,可能是用法问题冤枉了百度编辑器,如果是我的用法有问题欢迎大侠们指正 <!DOCTYPE type> <html> <head> <met ...
- Netty事件监听和处理(下)
上一篇 介绍了事件监听.责任链模型.socket接口和IO模型.线程模型等基本概念,以及Netty的整体结构,这篇就来说下Netty三大核心模块之一:事件监听和处理. 前面提到,Netty是一个NIO ...
随机推荐
- Android实现QQ登录
https://www.jianshu.com/p/e59bc198e88f
- Android上传图片的两种方式
参考:https://www.jianshu.com/p/f47943880cea
- Qt子类化后qss设置背景色无效的问题
1.问题背景 在某个类中,用到了一个组合的widget,有按钮进度条等,类似于视频播放器按钮控制区和精度条(参考了很多feiyangqingyun的文章,感谢),调试正常后整理代码,为了提高代码可读性 ...
- Python os.write() 方法
write()方法语法格式如下:高佣联盟 www.cgewang.com os.write(fd, str) 参数 fd -- 文件描述符. str -- 写入的字符串. 返回值 该方法返回写入的实际 ...
- 转载——完整的ASCII码表
完整的ASCII码表,转载自下面的博主: http://www.cnblogs.com/xmxu/archive/2012/07/10/2584032.html
- TCP为什么做三次握手、四次挥手
TCP 为什么做三次握手.四次挥手? TCP 是为了解决可靠传输出现的.为了实现可靠性,TCP 做了流量控制.拥塞控制,并且在建立.关闭连接前做些机制:三次握手.四次挥手. 三次握手是为了让客户端.服 ...
- linux之shell基本认知操作和简单shell练习
shell编程: 1.Shell的作用 命令解释器,“翻译官”.介于操作系统内核与用户之间,负责解释命令行. shell功能非常强大,除负责解释名另外,还可以将多个命令组合起来,完成复杂的任务,这就是 ...
- 笨办法学python3练习代码ex21.py
def add(a, b): print(f"ADDING {a} + {b}") return (a + b) def subtract(a, b): #subtract :减去 ...
- 微信小程序订阅消息调研
相关资料 背景:微信模板消息已正式下架,改为订阅消息,详情如下: 服务变更通知 订阅消息:订阅消息相关内容如下: 订阅消息 接口设计 获取接口访问凭证 :根据appId和secret获取接口访问凭证a ...
- .Net Core中简单使用MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式且面向文档存储的开源数据库系统. 下载地址: https://www.mongodb.com/download-center/community ...