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
相关产品推荐
相关产品推荐

