为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
钩子可用于(before
,
after
,failed
)和(insert
,update
,delete
)。
简单地重写像before_commit_from_insert
,failed_commit_from_insert
,
after_commit_from_delete
等。
使用说明
before_commit_u*将始终激发,而after_ucommit_u*或failed_ucommit之一_* 如果满足两个条件就会开火。
- 您可以在从处理程序提交中处理自己的异常。
- 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_事务支持
- 添加层叠选项
- 很容易看到哪些钩子将在调试器中运行