【问题标题】:Django get_or_create vs catching IntegrityErrorDjango get_or_create 与捕获 IntegrityError
【发布时间】:2014-05-07 13:07:02
【问题描述】:

我想在数据库中插入几行User。我真的不在乎插入是否成功,只要我收到通知,在这两种情况下我都能做到,那么在性能(主要是速度)方面哪个更好?

  1. 始终插入行(通过调用模型的save 方法)并捕获潜在的IntegrityError 异常
  2. QuerySet 类调用get_or_create 方法

【问题讨论】:

    标签: django django-orm


    【解决方案1】:

    想想你在做什么:你想在数据库中插入行,如果对象存在,你不需要从中取出。 Ask for forgiveness,并捕获IntegrityError异常:

    try:
        user = User(username=username)
        user.save()
    except IntegrityError:
        print "Duplicate user"
    

    这样可以避免get_or_create() 进行额外的get() 查找的开销。

    仅供参考,EAFP 是 Python 中的一种常见实践/编码风格:

    请求宽恕比请求许可更容易。这个常见的 Python 编码风格假定存在有效的键或属性,并且 如果假设被证明是错误的,则捕获异常。这个干净又快速 风格的特点是存在许多尝试和例外 声明。

    另见:https://stackoverflow.com/questions/6092992/why-is-it-easier-to-ask-forgiveness-than-permission-in-python-but-not-in-java

    【讨论】:

    • 我同意你的看法 - 没有阅读问题的性能位 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2018-02-12
    • 1970-01-01
    • 2016-12-01
    • 2014-08-22
    相关资源
    最近更新 更多