Flask-SQLAlchemy事件钩子介绍

一、前言

前几天在搜资料的时候无意中看到有介绍SQLAlchemy触发器,当时感觉挺奇怪的,触发器不是数据库层面的概念吗,怎么flask-SQLAlchemy这个ORM框架会有这玩意。

二、SQLAlchemy触发器一个简单例子

考虑到效率博客表中有两个字段,body用于存储markdown源文本,body_html存储转换成html的内容,这里就可以在保存数据时使用SQLAlchemy的触发器来监听body的值然后直接生成body_html内容。

生成后的数据如下:

markdown组件会将markdown源文本转换成HTML。

三、SQLAlchemy 事件钩子

SQLAlchemy ORM包含多种可供订阅的钩子,可以进行扩展,它主要有以下几类事件

  • 会话事件:比如执行更新删除语句事件,生命周期事件。

  • 映射事件:指将用户定义的类映射到Table的事件。

  • 实例事件:ORM映射实例的构造事件。

  • 属性事件:在ORM映射对象的各个属性上发生时触发,上面例子就是该事件。

  • 查询事件:构造Query对象时触发。

注:大多数据开源框架都会提供扩展点(钩子),在十几年前做数据库水平切割的时候就是扩展了IBatis 的SQL执行器,通过对UUID取模的方式做记录到对应分表的路由,其实说白了就是在SQL执行器里把SQL语句中的表名替换成分表表名 ,这样使用你这个组件的人就不用去关注具体的分表逻辑,只需要配置分表的数量和分表算法依赖的字段。

属性事件参数说明

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

  • target:接收事件对象的实例。

  • value: 正在设置的值

  • oldvalue:正在替换上一个值

  • initiator:表示事件的开始。

属性事件的参数既有value,也有oldvalue,这和MySQL的触发器差不多,所以有文章在介绍SQLAlchemy事件时也叫触发器,其实指的就是SQLAlchemy属性事件。

db.event.listen(Post.body,'set',Post.on_changed_body)

第一参数:表示监听的对象,可以是模型类或类属性。

第二参数:监听属性事件标记,参数有set、append、remove、init_scalar、init_collection。

第三个参数:绑定的事件处理方法。

注:大致翻看了一个事件这块的源代码,读不太懂,不过可以确定的是这个触发器名称是来源于SQLAlchemy 事件钩子中的属性事件,与实际MySQL触发器没有直接关系。

四、MySQL触发器

触发器是一种特殊的存储过程,在定义触发器时会定义触发器的触发条件,使得触发器在满足触发条件时自动执行而不需要人为调用。

关于MySQL数据库的触发器其实业务中很少用到,尤其是互联网公司需要考虑系统性能和扩展性是几乎不会在数据库层面写什么存储过程触发器这些玩意,但特殊场景其实也可以使用。

  1. 以前在做会员数据存储迁移时,需要把几千万的数据从MySQL存储迁移到KV存储,需要实现系统平滑无缝切换,就用了触发器来监听会员表数据变更情况,当有变更时将主键记录下来,然后用另外一个脚本持续同步这些变更的数据 。

  2. 窗帘业务的POS和网站是两套独立的系统,网站的商品库存是POS系统的一个子集,为了保证网站不超卖,需要将门店的实时库存及时同步到网站库存表中,我们也是用了触发器来实现。

相关推荐
闲人编程几秒前
Python在网络安全中的应用:编写一个简单的端口扫描器
网络·python·web安全·硬件·端口·codecapsule·扫描器
熙客4 分钟前
TiDB:分布式关系型数据库
java·数据库·分布式·tidb
Mr_Xuhhh3 小时前
GUI自动化测试--自动化测试的意义和应用场景
python·集成测试
2301_764441333 小时前
水星热演化核幔耦合数值模拟
python·算法·数学建模
循环过三天3 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法
你想考研啊3 小时前
oracle导出 导入
数据库·oracle
Q_Q5110082853 小时前
python+django/flask的眼科患者随访管理系统 AI智能模型
spring boot·python·django·flask·node.js·php
SunnyDays10115 小时前
如何使用Python高效转换Excel到HTML
python·excel转html
韩立学长5 小时前
基于Springboot的旧时月历史论坛4099k6s9(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
Q_Q5110082855 小时前
python+django/flask的在线学习系统的设计与实现 积分兑换礼物
spring boot·python·django·flask·node.js·php