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 事件监听与初始化的更多相关文章

  1. 关于vue事件监听的一个问题

    由于新工作需要用vue,所以最近接触最多的也是vue,因为之前一直在用react,所以对于vue上手还是很快的.我也尽量找一些他们两个的异同点,除了多了一些辅助用的方法以外,最大的不同应该是对于组件间 ...

  2. Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  3. android开发事件监听

    第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...

  4. 事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener

    本版本为1.0,支持较少,使用不够方便.相关封装逻辑结构已升级至2.0,详情可参见:更完善的安卓事件监听实现 先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机 ...

  5. tomcat的事件监听

    //事件涉及的三个组件:事件源.事件对象.事件监听器 //一个总的事件监听器接口,所有不同分类的事件监听器都继承这个接口 public interface EventListener {} //例如  ...

  6. [问题贴]mui.openWindow+自定义事件监听操作让alert()执行两次

    仔细看,Alert函数执行了两次 共两个页面:index.html和detail.html, detail.html为按钮设置了自定义事件监听(newsId),触发alert. 在index.html ...

  7. Java中的事件监听机制

    鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...

  8. 百度编辑器的内容改变事件监听bug

    先贴上我的初始化代码,可能是用法问题冤枉了百度编辑器,如果是我的用法有问题欢迎大侠们指正 <!DOCTYPE type> <html> <head> <met ...

  9. Netty事件监听和处理(下)

    上一篇 介绍了事件监听.责任链模型.socket接口和IO模型.线程模型等基本概念,以及Netty的整体结构,这篇就来说下Netty三大核心模块之一:事件监听和处理. 前面提到,Netty是一个NIO ...

随机推荐

  1. amazeui 验证按钮扩展

    做一个发送验证码按钮,点击后要60秒之后才能再次点击,利用原有的amazeui样式做的一些扩展,当然主题功能的代码全都是自己写的,也可以脱离amazeUi 自己完成这个功能按钮 代码如下: <! ...

  2. Python for循环使用 else 语句

    Python for循环使用 else 语句: else:当 for 所有的语句代码块正常运行完,才会运行 else 语句. 示例: ''' for 迭代对象 in 序列: 代码块(一行语句或多行代码 ...

  3. Unicode 字符串

    Unicode 字符串 Python 中定义一个 Unicode 字符串和定义一个普通字符串一样简单:高佣联盟 www.cgewang.com >>> u'Hello World ! ...

  4. Use SQL to Query Data from CDS and Dynamics 365 CE

    from : https://powerobjects.com/2020/05/20/use-sql-to-query-data-from-cds-and-dynamics-365-ce/ Have ...

  5. java 遍历数组常见的3种方式

    1.for循环,最常见 2.利用foreach 3.利用jdk自带的方法  --> java.util.Arrays.toString()

  6. Web优化躬行记(3)——图像和网络

    一.图像 1)响应式图像 浏览器根据屏幕大小.设备像素比.横竖屏自动加载合适的图像. 响应式的功能可以通过srcset和sizes两个新属性实现. 前者可指定选择的图像以及其大小,后者会定义一组媒体条 ...

  7. 【JZOJ4725】质数序列 题解(数学)

    题目大意:质数序列是指这个序列中任意两个数的和均为质数.先给出一个序列${a_{n}}$,从中取出元素构成最长质数序列,问其长度并输出序列.若长度相同则求和最大的序列.保证答案唯一. -------- ...

  8. hashMap在jdk1.7与jdk1.8中的原理及不同

    在分析jdk1.7中HashMap的hash冲突时,不知大家是否有个疑问就是万一发生碰撞的节点非常多怎么版?如果说成百上千个节点在hash时发生碰撞,存储一个链表中,那么如果要查找其中一个节点,那就不 ...

  9. SpringMVC 集成 JWT验证方式

    JWT官网: https://jwt.io/ 这里以java的ssm框架为例,集成jwt. 1.pom.xml 导入jwt的包 <!-- jwt --> <dependency> ...

  10. 安装Scrapy的时候报错error: Microsoft Visual C++ 14.0 is required.

    error: Microsoft Visual C++ 14.0 is required. 问题:我在python安装Scrapy的时候发现报错,并安装不上. 解决思路:安装这个微软的库,但是这个库很 ...