我閱讀了關於事務的文檔,但仍然有點失落,應該怎麼做。 可以說我有類書籍(名稱,內容,left_key,right_key,級別)在models.py中使用方法,它將書籍內容存儲爲嵌套集合。我想使用的主要方法是Django models.py事務回滾/提交問題
@transaction.commit_on_success
def add_node(self,right,level):
cursor = connection.cursor()
cursor.execute("UPDATE cms_Book SET left_key = left_key + 2, right_key = right_key + 2 WHERE left_key > %s",[right])
cursor.execute("UPDATE cms_Book SET right_key = right_key + 2 WHERE right_key >= %s AND left_key < %s ",[right,right])
cursor.execute("INSERT INTO cms_Book SET left_key = %s, right_key = %s + 1, level = %s + 1, content='roar'",[right,right,level])
但作爲插入主要依賴於從模板作爲參數傳遞鍵我需要檢查,如果正確的鑰匙插入。即使例如被插錯鍵,節點仍然會增加沒有什麼會中斷,也不會發生異常,但是邏輯會被打破,這不是很好,以防我需要獲得特定的節點,而不是所有的節點。
所以我有其他幾種方法來檢查邏輯是否正確。這裏是其中的一個:
def check_count(self):
q = Book.objects.aggregate(min_key = Min('left_key'),max_key= Max('right_key'),count_all = Count('id'))
return q
我需要的是一種執行在add_node方法的所有動作是什麼,然後檢查邏輯沒有與檢查方法打破,如果沒有,一切承諾,否則回滾。我什麼樣的不明白的是,如果我使用try except塊我需要DB產生某種錯誤/異常的也不會,或例如做其中:
if (check_my_table_for_all_different_keys == none):
transactions.commit
else:
transactions.rollback
check_my_table_for_all_different_keys - 如果所有密鑰都是唯一的,則不返回任何內容,否則返回相同或具有相同密鑰的對象的ID。另外我不確定應該如何確切應該看看我在哪裏提交所有3個交易,以防if-else結構的邏輯是正確的,我認爲這不是。
問題2)當我試圖使用`@ transaction.commit_on_success`沒有得到保存到數據庫 問題3)將器transaction.commit()保存所有三個查詢一次?因爲我使用`transaction.commit_unless_managed()`來執行每個查詢以保存到數據庫。 問題4)如何正確地添加代碼到註釋:D,因爲`代碼`只能用於一行,據我瞭解。 – Viktor 2011-02-04 11:46:25