django - 在Django的ORM中,有没有办法检测代码是否在事务内执行?

标签 django psycopg2 django-orm

例如,我想要这个功能:

from django.db import transaction


with transaction.atomic():
    assert inside_transaction() == True


assert inside_transaction() == False

有办法实现这一点吗?或者如果不在 Django 的 ORM 中,是否可以直接在 psycopg2 中检测?

最佳答案

查看source code [GitHub]对于 transaction.atomic 使用的 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 是一个私有(private) 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

关于django - 在Django的ORM中,有没有办法检测代码是否在事务内执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69465595/

相关文章:

django - 如何从 Django Form FileField 中提取文件对象

python - postgresql:共享内存不足?

django - Django 可以做嵌套查询和排除吗

Python 和 PostgreSQL : Function to insert variable arg into table?

django - 如何使用 Django ORM 删除 id 最小的行?

python - Django 批量更新触发 save()

python - Django DeleteView 不会从数据中删除对象

python - simplejson 换行符

javascript - 在 Django 应用程序中使用 JavaScript 加载文件

python - 测试 PostgreSQL 表是否不存在(使用 psycopg2)