You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django+PostgreSQL单查询get_or_create及异步aget_or_create解决方案咨询

PostgreSQL专属原子性get_or_create现成方案

1. django-postgres-extra 包

这是专门为PostgreSQL扩展Django ORM的成熟工具包,内置了原子性的get_or_create和异步aget_or_create,完全解决原生方法的竞态问题。

安装

pip install django-postgres-extra

配置

在Django项目的settings.py中添加应用:

INSTALLED_APPS = [
    # ... 其他应用
    "psqlextra",
]

同步用法

替换原生get_or_create,直接使用模型的get_or_create方法(该包会替换模型的管理器):

from myapp.models import MyModel

# 原子性执行:不存在则创建,存在则获取,无竞态问题
instance, created = MyModel.objects.get_or_create(
    unique_field="value",
    defaults={"other_field": "default_value"}
)

异步用法

支持异步ORM的aget_or_create,用法和同步一致:

from myapp.models import MyModel

# 异步原子操作
instance, created = await MyModel.objects.aget_or_create(
    unique_field="value",
    defaults={"other_field": "default_value"}
)

原理说明

该包利用PostgreSQL的INSERT ... ON CONFLICT DO NOTHING特性,将"查询-创建"合并为一个原子性操作:先尝试插入记录,若触发唯一约束冲突则直接查询现有记录,全程在单个数据库事务内完成,彻底避免原生方法因竞态导致的IntegrityError。

内容的提问来源于stack exchange,提问作者rioted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:41:07