如何合併兩列並應用過濾器?例如,我想同時搜索「名字」和「姓氏」列。這裏是我是如何被做,如果只搜索一列:sqlalchemy過濾多列
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
如何合併兩列並應用過濾器?例如,我想同時搜索「名字」和「姓氏」列。這裏是我是如何被做,如果只搜索一列:sqlalchemy過濾多列
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
您可以使用SQLAlchemy的or_
function在多個列搜索(下劃線是需要從Python的or
區別)。
下面是一個例子:
from sqlalchemy import or_
query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar),
User.lastname.like(searchVar)))
您可以使用'|'運算符而不是'or_',就像這樣 - '(User.firstname.like(searchVar))| (User.lastname.like(searchVar))',但是你應該小心使用'|'優先級,沒有括號,當與比較運算符混合時,它會產生非常意想不到的結果。 – 2010-08-01 17:05:57
不應該是'filter.or_(case1,case 2)'? – fedorqui 2013-05-23 09:09:10
這是錯誤的,因爲問題是關於ORM,但鏈接導致表達式。 – user2846569 2015-02-19 08:52:35
你可以簡單地調用filter
多次:
query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \
filter(User.lastname.like(searchVar2))
在大型mysql表中使用多個'filter()'方法並在單個'filter'中使用多個條件(通過'or_'或'and_')之間是否存在任何性能差異? – Sangram 2014-07-28 09:12:02
多個「過濾器」調用是否像邏輯「AND」而不是「OR」一樣? – danodonovan 2015-06-09 10:15:54
這將是AND – 2015-06-15 19:52:35
有辦法做到這一點編號:
使用過濾器(和運營商)
query = meta.Session.query(User).filter(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
使用filter_by(和運營商)
query = meta.Session.query(User).filter_by(
firstname.like(search_var1),
lastname.like(search_var2)
)
鏈接過濾器(和運營商)
query = meta.Session.query(User).\
filter_by(firstname.like(search_var1)).\
filter_by(lastname.like(search_var2))
使用or_()或and_(),而不是()
from sqlalchemy import and_, or_, not_
query = meta.Session.query(User).filter(
and_(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
)
這些不同的方法有什麼值得注意的性能差異嗎? – Miek 2018-03-11 00:23:33
我認爲這個問題符合我的問題,但答案不適用於我的特定情況。如果firstname是「joe」而lastname是「smith」,那麼我正在尋找一個過濾器語句,當提供的searchVar是「joe smith」時它將匹配。即,在進行測試之前,需要將這些字段連接起來(並添加空格)。看起來像一個非常真實的場景。 – Groovee60 2015-05-13 15:12:09
@ Groovee60這正是我正在尋找的。如果你能分享你的解決方案,如果你找到了解決方案,我將不勝感激。 – Lilylakshi 2017-05-30 11:17:37