or_運營商可以在數目不詳或查詢組件的情況下非常有用。
例如,我們假設我們正在創建一個REST服務,其中包含幾個可選的過濾器,如果任何過濾器返回true,應該返回記錄。另一方面,如果參數未在請求中定義,我們的查詢不應該改變。如果沒有or_功能,我們必須做這樣的事情:
query = Book.query
if filter.title and filter.author:
query = query.filter((Book.title.ilike(filter.title))|(Book.author.ilike(filter.author)))
else if filter.title:
query = query.filter(Book.title.ilike(filter.title))
else if filter.author:
query = query.filter(Book.author.ilike(filter.author))
隨着or_功能,它可以被改寫爲:
query = Book.query
not_null_filters = []
if filter.title:
not_null_filters.append(Book.title.ilike(filter.title))
if filter.author:
not_null_filters.append(Book.author.ilike(filter.author))
if len(not_null_filters) > 0:
query = query.filter(or_(*not_null_filters))
注意,這種方法支持使用發電機,所以如果你有事情或一個長長的清單,你可以做'過濾器(or_(User.name == v ('Alice','Bob','Carl')))' – robru
@ Robru的建議是不必要的低效率。如果你已經有一個集合,那麼你應該像這樣使用'in_'運算符:'filter(User.name.in _(['Alice','Bob','Carl']))' – intgr
啊,謝謝我沒有意識到sqlalchemy有那個過濾器 – robru