为sqlalchemy提供对象级提交挂钩

sqlalchemy-commithooks的Python项目详细描述


概述

sqlalchemy_commithooks允许将操作推迟到提交时间。 它还允许对象在commit失败时执行操作。

这有助于保持与外部系统的一致性,例如:

  • 发送事件
  • s3同步
  • redis队列同步

sqlalchemy_commithooks需要python>;=3.6。这很难(不可能?) 在不更改api或修改sqlalchemy的情况下四处走动。

如果未使用提交挂钩,则不会有开销。

开始

使用sqlalchemy_commithooks.Session而不是sqlalchemy.orm.Session。 SESSIXIN也被定义,如果你已经子类会话:

session=sqlalchemy_commithooks.Session()

向您的映射类中添加SqLalCythyCuthoOKS.CysMin并使用9个钩子中的任何一个:

classData(Base,sqlalchemy_commithooks.CommitMixin):defbefore_commit_from_insert(self):pass

钩子可用于(beforeafterfailed)和(insertupdatedelete)。

简单地重写像before_commit_from_insertfailed_commit_from_insertafter_commit_from_delete等。

使用说明

before_commit_u*将始终激发,而after_ucommit_u*或failed_ucommit之一_* 如果满足两个条件就会开火。

  1. 您可以在从处理程序提交中处理自己的异常。
  2. You are using sqlalchemy's recommended transaction semantics (commit/rollback)

如果插入(刷新)、更新(刷新)、删除(刷新)对象 然后调用commit,insert/update/delete方法将在 即使对象在提交之后不会持久。

将应用“提交前”中的更新,但不会级联/触发任何 *通过电话提交。

限制

sqlalchemy_commithooks不能解决所有问题。举个例子,它不是 对网络中断非常可靠:

DB.add(mapped_object)DB.commit()#  before_commit_from_insert is run, puts an object into s3#  network outage occurs now#  actual commit to DB fails (network outage)#  failed_commit_from_insert is run, fails to remove object from s3

对于每个用例,您必须确定哪些具有优先级。

如果db commit失败,则应发送通知(通知已发送, 那么网络中断会阻止完全提交吗?或者事件通知 如果提交成功,则可能不发送(事务已提交,网络 中断阻止通知?

待办事项

  • 添加session.nested_事务支持
  • 添加层叠选项
  • 很容易看到哪些钩子将在调试器中运行

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何优化orientdb查询   Android/java解析带有编号数据的JSON   javascript IE 11找不到运行小程序的Java插件   aar中未包含java类   java在JCEF浏览器中获取网页截图   string Java:在不使用循环的情况下将输入与列表中的所有内容进行比较?   regex如何使用(正则表达式)删除java中的重复字母,并且不区分大小写   数组如何在java中获取timeRangeEndDate和timeRangeStartDate?   java jBPM 6.1 Hello World   java有些对象无法通过Gson反序列化   java iText 7将PDF层(OCG)与基本PDF合并   java程序在使用log4j和springframework上课前立即暂停   java使用SSO处理用户身份验证   在java中从字符串中提取日期   Java WebDAV客户端作为Windows中的虚拟驱动器