在 Django 的 ORM 中,有没有办法检测代码是否在事务内部执行?
In Django's ORM, is there a way to detect whether code is executing inside a transaction?
例如,我想要这个功能:
from django.db import transaction
with transaction.atomic():
assert inside_transaction() == True
assert inside_transaction() == False
有办法实现吗?或者如果不是在 Django 的 ORM 中,是否可以直接在 psycopg2 中检测?
查看 Atomic
class 的 source code [GitHub] 被 transaction.atomic
使用,它在连接上设置了标志 in_atomic_block
。因此,如果你想检查你的代码是否在交易中,你可以写如下:
with transaction.atomic():
assert transaction.get_connection().in_atomic_block == True
assert transaction.get_connection().in_atomic_block == False
注意:如果您指定using
调用[=13],get_connection
函数可选地接受一个参数using
=],你也应该将它传递给 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
例如,我想要这个功能:
from django.db import transaction
with transaction.atomic():
assert inside_transaction() == True
assert inside_transaction() == False
有办法实现吗?或者如果不是在 Django 的 ORM 中,是否可以直接在 psycopg2 中检测?
查看 Atomic
class 的 source code [GitHub] 被 transaction.atomic
使用,它在连接上设置了标志 in_atomic_block
。因此,如果你想检查你的代码是否在交易中,你可以写如下:
with transaction.atomic():
assert transaction.get_connection().in_atomic_block == True
assert transaction.get_connection().in_atomic_block == False
注意:如果您指定using
调用[=13],get_connection
函数可选地接受一个参数using
=],你也应该将它传递给 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