2016-05-09 116 views
1

我正在開發對存儲在postgres django數據庫中的數據進行操作的優化算法。我的算法不得不重複修改數據庫中的對象,有時會恢復所做的更改(對於那些知道的人來說,它是元啓發式算法)。 問題是我不想在此過程中保存對postgres數據庫的修改。當我對優化結果感到滿意時,我想在流程結束時保存修改。我認爲解決方案是將所有相關的對象加載到內存中,對它們進行處理,最後將內存中的對象保存到數據庫中。在不修改它的情況下處理Django數據庫

但是它似乎比我想象的更困難......

事實上,當我將一個Django查詢(即model1.objects.getmodel.objects.filter),我擔心Django的調用有時對象在數據庫中,有時在它的緩存中,但我很確定,在某些情況下,它不會與我手動加載到內存中的實例相同(這是我想要工作的實例,因爲它們可能在數據庫加載後發生了更改)...

有沒有辦法繞過這些問題?

我實現了一種自定義的迷你數據庫,但它的維護變得非常困難,而且總體而言,我認爲這不是最簡單和優雅的方式。我想將postgres數據庫的相關模型轉儲到內存中(爲了性能),在這個內存數據庫上工作,並且在完成我的算法時,從內存中的數據更新原始數據庫的數據(這意味着django可能會通過pk保留原始對象與內存數據庫中的對象之間的鏈接,以識別哪些是相同的,我不知道是否有可能)。

有人有洞見嗎?

預先感謝您。

回答

1

你正在尋找的是交易。 RDBS最強大的功能之一。在開始播放數據之前,只需使用START TRANSACTION即可。最後如果你對它感到滿意,請使用COMMIT。如果你不想讓你的Django應用程序看到更改使用ROLLBACK。

由於postgresql的默認事務隔離級別,您的django應用程序將不會看到您在其他地方正在做的任何更改,直到它提交。與此同時,即使未提交,您在sql控制檯或其他代碼中執行的任何更改都將對該代碼可見。

Read Committed是PostgreSQL中的默認隔離級別。當一個 事務使用此隔離級別時,SELECT查詢(沒有FOR UPDATE/SHARE子句)僅查看在查詢開始之前提交的數據; 它從不會看到未提交的數據或 由併發事務執行查詢期間提交的更改。實際上,SELECT查詢 在查詢開始到 運行的瞬間即可看到數據庫的快照。但是,SELECT確實看到在其自己的交易中執行的以前更新 的效果,儘管它們尚未提交

+0

非常感謝! – Svan

+0

非常歡迎。既然你在這裏還是新手,我是否可以指出在這裏說'感謝'的首選方式是通過提高投票的好問題和有用的答案(一旦你有足夠的聲望這樣做),並接受最有幫助的答案到任何問題你問(這也給你一個小小的提升你的聲譽)。 請參閱[關於]頁面以及[如何在此提問?](http://stackoverflow.com/help/how-to-ask) – e4c5

相關問題