2012-06-21 36 views
6

Cách thêm 2 điều kiện vào mệnh đề ON khi bạn tham gia 2 bảng. Tôi có 3 ba bảng trong phân cấp với mỗi cờ đã xóa. Tôi phải tham gia tất cả các bảng này trong một truy vấn và bộ lọc dựa trên cờ đã xóa. Hiện tại các điều kiện được thêm vào mệnh đề where của truy vấn, mà không lọc các bản ghi đã xóa. Nó cần phải được thêm vào mệnh đề ON. Xin đề nghị.sqlalchemy - tham gia bảng con với 2 điều kiện

truy vấn hiện tại của tôi là như sau:

result = session.query(Host).filter(and_(Host.id.in_(ids), Host.deleted == False)).\ 
    join(Switch).filter(Switch.deleted == False).\ 
    join(Port).filter(Port.deleted == False).\ 
    options(joinedload('switches')).\ 
    options(joinedload('ports')).\ 
    all() 

Thankyou

Trả lời

5

Bạn có thể chỉ định mệnh đề ON explicitely trong Query.join gọi điện bằng onclause tham số. Sau đó, bạn truy vấn sẽ giống như dưới đây (chưa được thử nghiệm):

from sqlalchemy import and_ 

result = (session.query(Host).filter(and_(Host.id.in_(ids), Host.deleted == False)). 
    join(Switch, and_(Switch.host_id==Host.id, Switch.deleted == False)). 
    join(Port, and_(Port.switch_id==Switch.id, Port.deleted == False)). 
    options(joinedload('switches')). 
    options(joinedload('ports')). 
    all() 
) 
+0

Xin chào, Điều này không thêm bộ lọc vào kết quả. Cảm ơn – Prasadnsr

+1

Bạn có thể in truy vấn SQL kết quả không? (chỉ cần xóa * .all() * khỏi mã và in nó) – van

13

Hãy thử contains_eager thay vì joinedload. Điều gì đang xảy ra có thể là bạn có 4 tham gia hai bạn định nghĩa với tham gia và sau đó thì hai từ các tùy chọn (joinedload (...))

Sửa đổi mã của bạn, nên cung cấp này:

from sqlalchemy import and_ 

result = (session.query(Host).filter(and_(Host.id.in_(ids), Host.deleted == False)). 
    join(Switch, and_(Switch.host_id==Host.id, Switch.deleted == False)). 
    join(Port, and_(Port.switch_id==Switch.id, Port.deleted == False)). 
    options(contains_eager('switches')). 
    options(contains_eager('ports')). 
    all() 
) 
1

The and_() conjunction is also available using the Python & operator (mặc dù lưu ý rằng biểu thức hợp chất cần phải được ngoặc để hoạt động với hành vi Python hành ưu tiên): Ngoài ra còn có | for or_()~ for not_()

Vì vậy, sử dụng & điều hành mã của bạn sẽ trông như thế này:

result = session.query(Host).filter(Host.id.in_(ids) & (Host.deleted == False)). 
    join(Switch, (Switch.host_id==Host.id) & (Switch.deleted == False)). 
    join(Port, (Port.switch_id==Switch.id) & (Port.deleted == False)). 
    options(contains_eager('switches')). 
    options(contains_eager('ports')). 
    all() 
) 
Các vấn đề liên quan