두 개의 열을 결합하고 필터를 적용하려면 어떻게합니까? 예를 들어 "이름"과 "성"열을 동시에 검색하려고합니다. 하나의 열만 검색하는 경우 다음과 같이합니다.
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
두 개의 열을 결합하고 필터를 적용하려면 어떻게합니까? 예를 들어 "이름"과 "성"열을 동시에 검색하려고합니다. 하나의 열만 검색하는 경우 다음과 같이합니다.
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()
메서드를 사용하는 것과 대규모 mysql 테이블에서 단일에서 여러 조건의 조합 (by or_
또는 and_
)을 사용하는 것 사이에 성능 차이가 filter
있습니까?
filter
호출이 논리가 AND
아닌 논리처럼 작동 OR
합니까?
SQLAlchemy의 or_
함수 를 사용 하여 둘 이상의 열에서 검색 할 수 있습니다 (파이썬의 열과 구별하기 위해 밑줄이 필요합니다 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)
그래?
여러 열에 대해 작동하는 일반적인 코드입니다. 응용 프로그램에서 검색 기능을 조건부로 구현해야하는 경우에도 사용할 수 있습니다.
search_key = "abc"
search_args = [col.ilike('%%%s%%' % search_key) for col in ['col1', 'col2', 'col3']]
query = Query(table).filter(or_(*search_args))
session.execute(query).fetchall()
참고 :는 %%
쿼리 형식화를 건너 뛰는 것이 중요합니다.