django - 在 Django 的 ORM 中,有没有办法检测代码是否在事务中执行?
问题描述
例如,我想要这个功能:
from django.db import transaction
with transaction.atomic():
assert inside_transaction() == True
assert inside_transaction() == False
有没有办法做到这一点?或者如果不在 Django 的 ORM 中,是否可以直接在 psycopg2 中检测?
解决方案
查看它使用的类的源代码 [GitHub]在连接上设置一个标志。因此,如果您想检查您的代码是否在事务中,您可以编写以下代码:Atomic
transaction.atomic
in_atomic_block
with transaction.atomic():
assert transaction.get_connection().in_atomic_block == True
assert transaction.get_connection().in_atomic_block == False
注意:该get_connection
函数可选地接受一个参数using
,如果您指定using
调用transaction.atomic
,您也应该将它传递给get_connection
。
更好的是,因为get_connection
它是一个私有 API,只需编写一个您自己的小函数来检查这一点:
from django.db import transaction
from django.db import (
DEFAULT_DB_ALIAS, connections,
)
def inside_transaction(using=None):
if using is None:
using = DEFAULT_DB_ALIAS
return connections[using].in_atomic_block
with transaction.atomic():
assert inside_transaction() == True
assert inside_transaction() == False
推荐阅读
- amazon-web-services - 我可以更改我的 AWS EB 应用程序的 PYTHONPATH 吗?
- c++ - endl、'\t' 和 '\n' 在 15 个制表符后不起作用
- c# - 如何以编程方式连接音频端点?
- node.js - Mongoose 使用 JSON 响应填充 3 个深层嵌套模式
- flutter - 在不应该改变的时候改变图片
- javascript - 如何构建 html 以利用媒体查询
- tinymce - Angular 和 TinyMCE,如何添加格式以将文本换行
- javascript - 我想使用 JavaScript DOM 制作更多详细信息按钮/选项卡
- python - 用于图像处理的尺度不变特征变换(SIFT)
- regex - 正则表达式:第 2 场比赛从第 1 场比赛的最后一个符号开始