gpt4 book ai didi

python - 当前交易发生错误。在 'atomic' block 结束之前不能执行查询

转载 作者:行者123 更新时间:2023-11-29 04:33:44 25 4
gpt4 key购买 nike

已阅读多个资源以获取解决方案,例如 Guaravs发布(包括评论中的所有建议)和Alexander ,仅举几例,但仍无法解决问题。创建数据库条目时出现错误@models.OrderItemTax.objects.create()

使用 django 1.11.3 和 MySQL 14.14

views.py **只有部分代码,因为该函数超过 600 行。

def checkout_cart(request):
try:
item_to_group_keys = []
promo_key = 'promo:' + str(request.user.id)

with connection.cursor() as cursor:
with transaction.atomic():
// more code here...
try:
with transaction.atomic(): // updated solution
event = ''
group = models.Group.objects.get(id=order_item.group.id)
now = timezone.now()
event_date = now.strftime('%Y-%m-%d')

try:
event = models.Event.objects.get(group_id=group.id, date=event_date)
try:
self_attendee = models.EventAttendee.objects.get(event=event,
user_id=request.user.id,
is_attending=True)
except:
self_attendee = models.EventAttendee.objects.create(event=event,
user_id=request.user.id,
is_attending=True)
self_attendee.save()
except models.Event.DoesNotExist:
event = models.Event.objects.create(group_id=group.id, date=event_date, planner_id=request.user.id)
todays_site_deal = models.SiteDeal.objects.get_deal()
if todays_site_deal is not None and todays_site_deal != '':
event.site_deal = todays_site_deal
event.save()

self_attendee = models.EventAttendee.objects.create(event=event, user_id=request.user.id, is_attending=True)
self_attendee.save()

initial_group_members = models.GroupMembership.objects.filter(group_id=group.id, status_id=1)
group_members = initial_group_members.exclude(user_id=request.user.id)

for gm in group_members:
userprofile = models.UserProfile.objects.get(user_id=gm.user_id)
attendee_request = models.EventAttendeeRequest.objects.create(event=event, user_id=gm.user_id)
attendee_request.status = models.EventRequestStatusOpt.objects.get(id=3)
attendee_request.save()
group_fn = gm.user.first_name
group_ln = gm.user.last_name
group_pn = userprofile.phone

if group_fn != '' and group_ln != '' and group_pn != '' and group_pn is not None:

non_digits = re.compile(r'[^\d]+')
group_pn = non_digits.sub('', group_pn)

# request_hash = str(member_request.pk) + str(group_id) + str(int(round(time.time())))
# request_hash = int(request_hash) ^ 0xABCEEFAB
# member_request.hash = request_hash

text_message = event.planner.first_name + " from your Cliiique " + event.group.name + " started shopping. Join today's event!"
try:
pn_check = client_lookup.phone_numbers.get(group_pn)

if pn_check.phone_number is not None: # if invalid, throws an exception
# SMS
# -------------------------------------------------
message = client_rest.messages.create(
body=text_message,
to=group_pn,
from_="+12132050074")
# -------------------------------------------------

except TwilioRestException as e:
pass


except: #group not in checkout, do not create event
pass

# Get tax amount for each Item
rate = Decimal('0.0950')
oi_price = Decimal(order_item.op_price.strip(''))
tax_amount = oi_price * rate
oi_tax = models.OrderItemTax.objects.create(amount=tax_amount,
rate=rate,
order_item_id=order_item.pk)
oi_tax.save()
except IntegrityError:
return HttpResponse("<strong>CODE #700: Fatal Transaction Error! Please contact customer service.</strong>")

最佳答案

来自 docs :

Avoid catching exceptions inside atomic!

由于函数有多个嵌套的 try 和 excepts,我在 try 和 except 最接近错误发生的地方插入了另一个 transaction.atomic()

根据文档,嵌套的 try 和 excepts 可能会使初始原子复杂化。我发现放置原子(第二次)有帮助。希望这可以帮助其他面临类似情况的人。

 try:
item_to_group_keys = []
promo_key = 'promo:' + str(request.user.id)

with connection.cursor() as cursor:
with transaction.atomic():
// more code here...
try:
with transaction.atomic(): // **added second atomic**
//more code
except:
pass
except IntegrityError:

关于python - 当前交易发生错误。在 'atomic' block 结束之前不能执行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50866370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com