【发布时间】:2014-05-07 13:07:02
【问题描述】:
我想在数据库中插入几行User。我真的不在乎插入是否成功,只要我收到通知,在这两种情况下我都能做到,那么在性能(主要是速度)方面哪个更好?
- 始终插入行(通过调用模型的
save方法)并捕获潜在的IntegrityError异常 - 从
QuerySet类调用get_or_create方法
【问题讨论】:
标签: django django-orm
我想在数据库中插入几行User。我真的不在乎插入是否成功,只要我收到通知,在这两种情况下我都能做到,那么在性能(主要是速度)方面哪个更好?
save 方法)并捕获潜在的IntegrityError 异常QuerySet 类调用get_or_create 方法【问题讨论】:
标签: django django-orm
想想你在做什么:你想在数据库中插入行,如果对象存在,你不需要从中取出。 Ask for forgiveness,并捕获IntegrityError异常:
try:
user = User(username=username)
user.save()
except IntegrityError:
print "Duplicate user"
这样可以避免get_or_create() 进行额外的get() 查找的开销。
仅供参考,EAFP 是 Python 中的一种常见实践/编码风格:
请求宽恕比请求许可更容易。这个常见的 Python 编码风格假定存在有效的键或属性,并且 如果假设被证明是错误的,则捕获异常。这个干净又快速 风格的特点是存在许多尝试和例外 声明。
【讨论】: