2011-06-07 70 views
2

每次在Django对象上调用save()方法时,Django都会执行两个查询INSERT和一个SELECT。在我的情况下,这是有用的,除了一些特定的地方,每个查询是昂贵的。有关如何有时声明不需要返回任何对象的任何想法 - 不需要SELECTDjango - 插入不返回已保存对象的ID

此外,我正在使用django-mssql来连接,这个问题似乎并不存在于MySQL上。

编辑:一个更好的解释

h = Human() 
h.name='John Foo' 
print h.id # Returns None, No insert has been done therefore no id is available 
h.save() 
print h.id # Returns the ID, an insert has taken place and also a select statement to return the id 

有时候我不需求的retruning ID,只需插入

+1

嗯,这很奇怪,MSSQL支持['INSERT ... OUTPUT'](http://msdn.microsoft.com/en-us/library/ms177564.aspx),所以我不明白为什么它会问题两个查询,但后来我再也不熟悉'django-mssql'。也许你可以为昂贵的查询构建自己的INSERT语句? – 2011-06-07 10:35:04

回答

0

40ins的答案是正确的,但可能当Django execustes一个保存()它可能有更高的成本...

,它需要确定如果对象是一个新的或一个现有的。所以它打到数据库来检查相关的对象是否存在。如果是的话,它会执行UPDATE,orherwise它会执行ISERT

检查documentatin from here ...

您可以使用force_insertforce_update,但可能是导致严重的数据完整性问题,就像创建一个重复的条目而不是更新现有的条目一样...

所以,如果你想使用force,你必须确定它是否会l是INSERT或UPDATE ...

0

尝试使用save()force_insertforce_update属性。有了这个属性,django知道记录的存在,并且不会进行额外的查询。

+0

问题不在于django是否检查是否存在问题,而是在每个“INSERT”后面运行一个“SELECT”语句以保持对象'id'方便。 – Siavash 2011-06-12 08:26:27

0

附加select是django-mssql后端从表中获取标识值以确定刚刚插入的标识。如果这个选择很慢,那么你的SQL服务器/配置有问题,因为它只是在做SELECT CAST(IDENT_CURRENT(*table_name*) as bigint)调用。