gpt4 book ai didi

python - 当查询在 Django 中以原子方式不返回任何行时,如何将新行插入表中?

转载 作者:行者123 更新时间:2023-11-29 02:59:12 26 4
gpt4 key购买 nike

我正在编写一个 Django 应用程序。如果没有行满足特定条件,我想在表中插入一个新行。例如:

if not SomeModel.objects.filter(in_use=True).exist():
new_using = SomeModel(start_at=datetime.datetime.utcnow(), in_use=True)
new_using.save()

我希望上面的代码是原子的,这样表中的 in_use=True 行不会超过一行。我了解到 django 有一个 atomic() 上下文管理器。所以我正在考虑这样做:

with transaction.atomic():
if not SomeModel.objects.filter(in_use=True).exist():
new_using = SomeModel(start_at=datetime.datetime.utcnow(), in_use=True)
new_using.save()

我对SQL不是很熟悉,所以我想知道上面的代码是否可以确保表中同时具有in_use=True的行不超过一行时间?如果不是,正确的做法是什么?

谢谢。

最佳答案

您可以向数据库中的SomeModel 表添加唯一约束。例如在 postgres 中(如何在其他数据库中做到这一点 https://dba.stackexchange.com/questions/4815/how-to-implement-a-default-flag-that-can-only-be-set-on-a-single-row ):

create unique index inuseuniq on somemodel (in_use) where in_use;

然后对 IntegrityError 做出适当的 react :

try:
# exist() query not needed
new_using = SomeModel.objects.create(start_at=datetime.datetime.utcnow(),
in_use=True)
except IntegrityError:
# someone already using SomeModel data
# try again or report to user

关于python - 当查询在 Django 中以原子方式不返回任何行时,如何将新行插入表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575701/

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