Làm cách nào để kết hợp hai cột và áp dụng bộ lọc? Ví dụ: tôi muốn tìm kiếm trong cả hai cột "họ" và "họ" cùng một lúc. Đây là cách tôi đã thực hiện nếu chỉ tìm kiếm một cột:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
Làm cách nào để kết hợp hai cột và áp dụng bộ lọc? Ví dụ: tôi muốn tìm kiếm trong cả hai cột "họ" và "họ" cùng một lúc. Đây là cách tôi đã thực hiện nếu chỉ tìm kiếm một cột:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
Câu trả lời:
Có một số cách để làm điều đó:
Sử dụng filter()
( và toán tử)
query = meta.Session.query(User).filter(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
Sử dụng filter_by()
( và toán tử)
query = meta.Session.query(User).filter_by(
firstname.like(search_var1),
lastname.like(search_var2)
)
Chuỗi filter()
hoặc filter_by()
( và nhà điều hành)
query = meta.Session.query(User).\
filter_by(firstname.like(search_var1)).\
filter_by(lastname.like(search_var2))
Sử dụng or_()
, and_()
và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
tài liệu nói rằng đó là để lọc bởi tham số keyword: query(Foo).filter_by(bar='baz')
. Điều đó liên quan như thế nào đến cú pháp bạn đã sử dụng trong câu trả lời ở trên?
Bạn chỉ cần gọi filter
nhiều lần:
query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \
filter(User.lastname.like(searchVar2))
filter()
phương pháp và sử dụng kết hợp nhiều điều kiện (bằng or_
hoặc and_
) trong một filter
bảng mysql lớn không?
filter
cuộc gọi sẽ hoạt động giống như một logic AND
hơn là một OR
?
Bạn có thể sử dụng or_
hàm của SQLAlchemy để tìm kiếm trong nhiều cột (cần có dấu gạch dưới để phân biệt với hàm của Python or
).
Đây là một ví dụ:
from sqlalchemy import or_
query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar),
User.lastname.like(searchVar)))
|
toán tử thay vì or_
, như thế này - (User.firstname.like(searchVar)) | (User.lastname.like(searchVar))
, tuy nhiên bạn nên cẩn thận với mức độ |
ưu tiên, không có dấu ngoặc đơn, nó có thể tạo ra kết quả RẤT bất ngờ khi trộn với các toán tử so sánh.
filter.or_( case1, case 2)
?
Một đoạn mã chung sẽ hoạt động cho nhiều cột. Điều này cũng có thể được sử dụng nếu có nhu cầu triển khai có điều kiện chức năng tìm kiếm trong ứng dụng.
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()
Lưu ý: điều %%
quan trọng là bỏ qua% định dạng truy vấn.