【问题标题】:Django: Difference between save() and create() from transaction perspectiveDjango:从事务的角度来看,save() 和 create() 之间的区别
【发布时间】:2011-05-11 13:06:25
【问题描述】:

Django 中的 create() 方法创建一个模型实例,然后调用 save(),据说这会触发提交。所以触发事务的提交应该没有任何区别。

但实际上,在 Postgresql 上执行一个使用 create() 创建一堆模型实例的方法,我得到了 transaction aborted, commands ignored until end of transaction 异常。该方法在非事务性数据库后端运行良好。此外,当我将 create() 替换为:

m = Model(attr1=..., attr2=...)
m.save()

它也可以在 Postgresql 上运行。

在事务的意义上使用save()create() 有区别吗?

edit: create() 还在调用 save() 之前设置了self._for_write = True,但我无法追踪它是否对事务行为有任何影响。

编辑:示例代码可以在here找到。

【问题讨论】:

    标签: django transactions commit


    【解决方案1】:

    你可能已经看到了,create() is just a wrapper for save()

    _for_write part 很可能只是用于数据库选择,所以我不会过多关注它。

    关于“事务中止”错误,如果没有看到您的代码,很难说出问题所在。也许你例如create() 违反了 UNIQUE 约束,导致 PostgreSQL 要求事务回滚,然后您尝试 save() 使用不同的数据 - 如果没有确切的代码,很难判断。

    【讨论】:

    • 感谢您的回复。我在问题中添加了指向示例代码的链接。如果进一步澄清会有所帮助,请告诉我。
    • 可能是这样的一些事务性问题:stackoverflow.com/questions/2235318/…(请注意,它是特定于 MySQL 的),但查看您的代码,我发现这两个版本不等效 - 工作版本 @987654328 @ 由slugcreate()sname,而另一个版本create()sname slug。所以也许这种不对称是问题的根源。
    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2017-04-24
    • 2011-12-04
    相关资源
    最近更新 更多