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系统的一个子集,为了保证网站不超卖,需要将门店的实时库存及时同步到网站库存表中,我们也是用了触发器来实现。

相关推荐
马克Markorg3 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
冷雨夜中漫步3 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴3 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再3 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
喵手5 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
Coder_Boy_5 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934735 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy5 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
肖永威6 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ7 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto