sqlalchemy不仅仅能自动创建数据库,更提供了其他更强大的功能,今天要介绍的就是sqlalchemy中的事件监听,并将其应用到数据库的初始化中。

需求:当插入设置password字段时,自动加密

  1. # -*- coding:utf- -*-
  2. from sqlalchemy import *
  3. from sqlalchemy import event
  4. from sqlalchemy.ext.declarative import declarative_base
  5. from sqlalchemy.orm import scoped_session, sessionmaker
  6. import hashlib
  7.  
  8. #这里定义一个password加密混淆
  9. password_prefix = "Ad%cvcsadefr^!deaf"
  10.  
  11. #定义数据库的账号、端口、密码、数据库名,使用的连接模块,这里用的是mysqldb
  12. engine = create_engine(
  13. 'mysql+mysqldb://root:1234567@localhost:3306/tech?charset=utf8',
  14. echo=False#是否输出数据库操作过程,很方便调试
  15. )
  16.  
  17. #定义一个函数,用来获取sqlalchemy的session
  18. def bindSQL():
  19. return scoped_session(sessionmaker(bind=engine))
  20.  
  21. Base = declarative_base()
  22. Base.__table_args__ = {'mysql_engine':'InnoDB'}#定义数据表使用InnoDB
  23.  
  24. class User(Base):
  25. __tablename__ = "user"
  26. id = Column(Integer, primary_key=True)
  27. name = Column(String(), unique=True)
  28. email = Column(String(), unique=True)
  29. password = Column(String())
  30. superuser = Column(Boolean, default=False)
  31.  
  32. metadata = Base.metadata
  33.  
  34. #定义一个回调函数用于响应触发事件
  35. def setPassword(target, value, oldvalue, initiator):
  36. if value == oldvalue:#如果新设置的值与原有的值相等,那么说明用户并没有修改密码,返回原先的值
  37. return oldvalue
  38. #如果新值与旧值不同,说明密码发生改变,进行加密,加密方法可以根据自己需求改变
  39. return hashlib.md5("%s%s" % (password_prefix, value)).hexdigest()
  40. #设置事件监听,event.listen(表单或表单字段, 触发事件, 回调函数, 是否改变插入值)
  41. event.listen(User.password, "set", setPassword, retval=True)
  42.  
  43. #为了避免重复插入数据,定义一个get_or_create函数,这个是模仿django的,有兴趣的同学可以google下
  44. def get_or_create(session, model, **kwargs):
  45. if "defaults" in kwargs:
  46. defaults = kwargs["defaults"]
  47. del kwargs["defaults"]
  48. else:
  49. defaults = {}
  50.  
  51. instance = session.query(model).filter_by(**kwargs).first()
  52. if instance:
  53. return instance, False
  54. else:
  55. kwargs.update(defaults)
  56. instance = model(**kwargs)
  57. session.add(instance)
  58. session.flush()
  59. session.refresh(instance)
  60. return instance, True
  61.  
  62. #定义初始化函数
  63. def initModel():
  64. metadata.create_all(engine)#创建数据库
  65. db = bindSQL()#获取sqlalchemysession
  66. #创建超级管理员,这里为了避免多次运行initModel而发生重复插入的情况,使用了get_or_create方法
  67. obj, created = get_or_create(
  68. db,
  69. User,
  70. name="administrator",
  71. defaults={
  72. "email": "332535694@qq.com",
  73. "password": "administrator",
  74. "superuser": True
  75. }
  76. )
  77. db.commit()#记得commit喔,不然数据最后还是没插入
  78. db.remove()
  79.  
  80. if __name__ == "__main__":
  81. 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. laravel开发调试工具laravel-debugbar的安装

    一.使用 Composer 安装该扩展包 composer require barryvdh/laravel-debugbar --dev 二.(可选)修改配置文件app/config.php Lar ...

  2. 1_Java语言概述

    学于尚硅谷开源课程 宋红康老师主讲 感恩 尚硅谷官网:http://www.atguigu.com 尚硅谷b站:https://space.bilibili.com/302417610?from=se ...

  3. Skill 如何翻转一个list

    https://www.cnblogs.com/yeungchie/ code 发现已经有内置了reverse(l_list) unless(fboundp('reverse) procedure(y ...

  4. 探究:编程语言那么多,为什么偏偏是 C 语言成了大学的必修课?

    谁叫你不幸生在中国了? ——何祚庥(中国科学院院士) 这是一本给非计算机专业的大学生的C语言的书.“我不是学计算机的,为啥要学C语言?”这个问题每年在中华大地都会被问上几百万次.被问的对象可能是老师, ...

  5. Nginx使用中遇到的问题记录

    问题一.关于空格 nginx配置对空格十分敏感,在关键字和符号的前后,一定记得有空格(或换行).一个典型的场景是 if { } 语句,大括号前后要有空格,否则可能出现非预期行为. 问题二.关于serv ...

  6. MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘

    背景 最近有一个数据统计服务需要升级SpringBoot的版本,由1.5.x.RELEASE直接升级到2.3.0.RELEASE,考虑到没有用到SpringBoot的内建SPI,升级过程算是顺利.但是 ...

  7. Android MTK平台 客制化系统来电界面(屏蔽 InCallUI 提供接口给客户自行展示来电去电页面)

    OS: Android 8.1 需求分析 1.禁止系统来电铃声,提供接口给客户自己播放铃声 2.禁止系统拉起来去电页面(InCallActivity),消息通知客户拉起自己的来去电页面 3.禁止来电消 ...

  8. api接口返回动态的json格式?我太难了,尝试一下 linq to json

    一:背景 1. 讲故事 前段时间和一家公司联调api接口的时候,发现一个奇葩的问题,它的api返回的json会动态改变,简化如下: {"Code":101,"Items& ...

  9. win7(64位)使用DEBUG

    win7 64位好像是不能直接打开DOS进行DEUBG的,于是查找相应解决方案 开始看其他人的帖子,写得语焉不详,后来一查,居然是抄百度的.....自己不觉得low吗... 参考百度经验的回答http ...

  10. 【学习笔记】ThreadLocal与引用类型相关知识点

    0 写在前边 今天以 "TheadLocal 为什么会导致内存泄漏" 为题与朋友们讨论了一波,引出了一些原理性的内容,本文就这个问题作答,并扩展相关的知识点 1 ThreadLoc ...