我們正在爲使用龍捲風和sqlalchemy的應用程序創建服務。該應用程序使用django編寫,並使用「軟刪除機制」。這意味着在底層的mysql表中沒有刪除。要將行標記爲已刪除,我們只需將屬性「delete」設置爲True即可。但是,在我們使用sqlalchemy的服務中。一開始,我們就開始通過SQLAlchemy中做出自己喜歡的查詢,添加檢查刪除:使用sqlalchemy實施「軟刪除」系統
customers = db.query(Customer).filter(not_(Customer.deleted)).all()
然而,這導致很多潛在的錯誤,因爲開發商往往錯過了在那裏查詢,刪除了檢查。因此,我們決定與我們的查詢類,做了「預過濾器」來覆蓋默認查詢:
class SafeDeleteMixin(Query):
def __iter__(self):
return Query.__iter__(self.deleted_filter())
def from_self(self, *ent):
# override from_self() to automatically apply
# the criterion too. this works with count() and
# others.
return Query.from_self(self.deleted_filter(), *ent)
def deleted_filter(self):
mzero = self._mapper_zero()
if mzero is not None:
crit = mzero.class_.deleted == False
return self.enable_assertions(False).filter(crit)
else:
return self
這從SQLAlchemy的文檔解決方案在這裏啓發:
https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/PreFilteredQuery
然而,我們仍然面臨的問題,比如在我們一起進行過濾和更新以及使用上面定義的這個查詢類的情況下,當應用更新過濾器時,更新不遵守delete=False
的標準。
db = CustomSession(with_deleted=False)()
result = db.query(Customer).filter(Customer.id == customer_id).update({Customer.last_active_time: last_active_time })
我如何能實現在SQLAlchemy的
這不會停止查詢沒有刪除,這是至關重要的。因爲整個觀點是避免錯誤。 – dusual
'customer_query().filter(something).update(something2)'應該將刪除過濾器和'something'過濾器一起應用。 – aitchnyu