2つの列を組み合わせてフィルターを適用するにはどうすればよいですか?たとえば、「名」列と「姓」列の両方を同時に検索したいとします。1つの列のみを検索する場合の方法は次のとおりです。
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
2つの列を組み合わせてフィルターを適用するにはどうすればよいですか?たとえば、「名」列と「姓」列の両方を同時に検索したいとします。1つの列のみを検索する場合の方法は次のとおりです。
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
回答:
それを行うにはいくつかの方法があります。
filter()
(および演算子)の使用
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)
)
論理積filter()
またはfilter_by()
(および演算子)
query = meta.Session.query(User).\
filter_by(firstname.like(search_var1)).\
filter_by(lastname.like(search_var2))
使用してor_()
、and_()
と、not()
from sqlalchemy import and_, or_, not_
query = meta.Session.query(User).filter(
and_(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
)
filter_by
ドキュメントは言う:それはキーワード引数によってフィルタリングするためだというquery(Foo).filter_by(bar='baz')
。これは、上記の回答で使用した構文とどのように関連していますか?
あなたは単にfilter
複数回呼び出すことができます:
query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \
filter(User.lastname.like(searchVar2))
filter()
メソッドを使用することと、単一ので複数の条件の組み合わせ(byor_
またはand_
)を使用することの間にパフォーマンスの違いはありますfilter
か?
filter
呼び出しは、論理的AND
ではなく論理的に機能しOR
ますか?
SQLAlchemyのor_
関数を使用して、複数の列を検索できます(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))
注意する必要があります。|
括弧を付けないと、比較演算子と混合すると非常に予期しない結果が生じる可能性があります。
filter.or_( case1, case 2)
ですか?