2011-06-07 69 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)調用。

相關問題