python将数据导入数据库 atomic_django:在transaction.atomic()内部提交和引发 - python

我们正在尝试从commit_manually迁移到atomic,以便可以在旧项目中将Django至少升级到1.8。在大多数情况下,我们需要执行以下操作:

with transaction.atomic():

obj = Entity.objects.select_for_update().get(pk=pk)

try:

obj.do_something()

obj.set_some_status()

obj.save()

except SomeException:

obj.set_failed_flag()

obj.save()

raise

因为被呼叫者需要此异常信息才能继续执行特定流程。但是在这种情况下,事务/保存点将被回滚,这不是我们想要的,因为我们希望obj.set_failed_flag()被提交。将它设置在同一原子块内似乎也是合乎逻辑的,因为我们已经为此对象设置了锁定行。

有什么想法/模式吗?提前致谢!

附言使用旧的手动交易管理是如此简单!

P.P.S.我们也将异常用于“提前退出”,并且将其移到一些标志等上会带来混乱的日志,我个人很想避免这种情况。

参考方案

假设SomeException不是数据库异常,则可以保存它并将其引发到原子块之外:

with transaction.atomic():

obj = Entity.objects.select_for_update().get(pk=pk)

try:

obj.do_something()

obj.set_some_status()

except SomeException as e:

obj.set_failed_flag()

exception = e

else:

exception = None

obj.save()

if exception:

raise exception

如果您觉得这太冗长并且需要经常执行,则可以编写一个上下文管理器来充当transaction.atomic()的代理,但在某些情况下不会触发回滚。

最后,请注意,Django仍然具有manual transaction management。

Django BigInteger自动递增字段作为主键? - python

我目前正在建立一个涉及大量集体智慧的项目。每个访问该网站的用户都将创建一个唯一的配置文件,然后将他们的数据用于为自己和其他用户计算最佳匹配。默认情况下,Django创建一个INT(11)id字段来处理模型的主键。我担心这会很快溢出(即,大约2.4b个设备在未事先设置Cookie的情况下访问了该页面)。如何在MySQL中将其更改为BIGINT并在Django自…Django Python日期时间设置为午夜 - python

我有django对象的日期时间,但可以是一天中的任何时间。它可以是一天中的任何时间,但我需要将时间设置为00:00:00(另一个日期设置为23:59:59,但原理是相同的)end_date = lastItem.pub_date 当前的结束日期是2002-01-11 12:34:56我需要怎么做才能将其更改为00:00:00?我试过了:end_date.ho…Django:使用contenttypes框架的一般关系示例? - python

我已经多次浏览了有关contenttypes框架的Django文档,但我对它的理解不足以在项目中实现泛型关系。我一直在寻找有关此事的在线示例或教程,但找不到一个。称我为哑巴,但在这方面我需要一些帮助(请不要仅通过链接到文档来回答问题)。基于在线资源的缺乏,我相信如果您用一个完整的例子来回答这个问题,您的答案可能是迄今为止有关django通用关系(奖金!)的最…Django:我应该如何存储货币价值? - python

我在这里遇到范式问题。我不知道该将钱存储为Decimal(),还是将其存储为字符串并将自己转换为十进制。我的推理是这样的: PayPal要求小数点后两位为,因此,如果我有49美元的产品,PayPal希望看到49.00。 Django的DecimalField()并未设置小数位数。它仅存储最大小数位数。因此,如果其中有49个字段,并且将字段设置为2个小数位,它…Django:错误:您无权访问该端口 - python

我是整个安装的新手,请保持友善。在dev上,该命令通常可以正常工作,但是自从我尝试使用Django的不同命令以来,某些东西就出错了。python manage.py runserver 0.0.0.0:80 我没有使用此端口的权限了。我可以使用端口8080,但将端口添加到url中通常的主机名末尾时,网站无法正常工作。当我使用端口80时,无论如何我都无需在UR…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值