我想在僅追加數據存儲中重新實現一些現有的SQLAlchemy模型;僅追加意味着對象僅使用INSERT語句更新,不使用UPDATE或DELETE語句。如何在SQLAlchemy中實現僅追加版本化模型
UPDATE和DELETE語句將被替換爲增加版本的另一個INSERT。會有一個is_deleted
標誌,取而代之的DELETE,新版本is_deleted=True
將被創建:
id | version | is_deleted | name | description ...
---- --------- ------------ ----------- ---------------
1 | 1 | F | Fo | Text text text.
1 | 2 | F | Foo | Text text text.
2 | 1 | F | Bar | null
1 | 3 | T | Foo | Text text text.
此外,
- 所有的SELECT語句都需要被重寫只爲最高版本號每個ID,如此問題所述:PostgreSQL - fetch the row which has the Max value for a column
- 所有(唯一)索引需要重寫爲「id」主鍵唯一,因爲每個id可能會出現多次。
我知道如何解決大多數問題,但我在SQLAlchemy中的事件掛鉤,將處理這需要在更新完成&刪除某些事情掙扎。
SQLAlchemy文檔已經有一些版本控制的基本示例。 versioned rows示例接近我想要的,但它們不處理(1)刪除和(2)外鍵關係。
(1)刪除。我知道有一個session.deleted
字段,我將以類似的方式迭代它,以便在versioned_rows.py示例中迭代session.dirty
- 但是,如何從要刪除的列表中取消標記項目&創建新項目? (2)上面提到的例子只處理父子關係,它的做法(過期關係)似乎需要每個模型的自定義代碼。 (2.1)有沒有辦法讓這個更靈活? (2.2)是否可以將SQLAlchemy的relationship()
配置爲針對給定的外鍵返回max(版本)的對象?
您正在尋找的術語是「軟刪除」。我不是很瞭解SQLAlchemy,但也許會幫助你。我個人可能會用數據庫端的觸發器來做到這一點。 – 2014-10-02 15:39:08
謝謝 - 我發現這個軟刪除,這有助於我的問題的第一部分http://stackoverflow.com/questions/23198801/sqlalchemy-using-aliased-in-query-with-custom-primaryjoin-relationship使用數據庫觸發器對我來說不是一種選擇,因爲我的模型頻繁更改,觸發器不能通過像alembic這樣的遷移工具很好地處理。 – lyschoening 2014-10-03 09:34:26
好奇的問題,我也很想看到處理這個問題的一些例子。關於鏈接到max(版本),更好的方法可能是沒有針對Head版本的版本號,因此您可以直接加入最新的記錄(version == None)。數據是否需要在同一個表中?只是想知道版本控制對象系統(創建第二個表,blah_history)是否可以簡化http://docs.sqlalchemy.org/en/latest/orm/examples.html#versioning-objects。它還處理刪除,因爲整個版本歷史記錄在輔助表中可用。 – 2014-10-12 02:05:02