我想知道如何在Django中实现基于事务的查询时改进(如果有的话)我的代码。
这就是我理解我在django文档中读到的ATOMIC_REQUEST的方法。我有这个功能视图:
from django.db import transaction
import sys
@transaction.atomic
def save_progress(request):
try:
with atomic.transaction():
qs = AllProgressModel()
qs.name = 'level up'
qs.level = 25
qs.description = 'Increased 2 level'
qs.save()
except:
print(sys.exc_info())
- 我做得对吗?
- 如果在保存期间发生连接丢失,是否会保存进度?
提前谢谢!
答案 0 :(得分:1)
你不需要装饰师@transaction.atomic
和with atomic.transaction()
,通常就足够了。
使用with atomic.transaction()
时,请抓住IntegrityError
个例外,而不是一次性广泛处理所有例外。
编辑:如果您正在处理原子块之外的异常(如下所示),那么更好的做法是拥有外部原子包装,以处理回滚和其他异常处理部分中可能需要的数据库操作。
from django.db import IntegrityError, transaction
def save_progress(request):
try:
# with atomic.transaction() -> produce error ( typo )
with transaction.atomic():
...
qs.name = 'level up'
qs.level = 25
qs.description = 'Increased 2 level'
qs.save()
except IntegrityError:
# You are here if something goes within the transaction, after rollback
# HANDLE exception