我快要瘋了。我有一個使用 SQLAlchemy 的 Flask 應(yīng)用程序。我想做一個我認為非常簡單的查詢:SELECT * FROM event eLEFT JOIN event_data ed on e.id = ed.event_idWHERE ed.datetime > '2018-12-01' 這是我的模型class Event(db.Model): __tablename__ = 'event' id = db.Column(db.Integer, primary_key=True) # ... many fields... event_data = db.relationship("EventData", back_populates="event", lazy='joined', order_by="desc(EventData.id)")class EventData(db.Model): __tablename__ = 'event_data' id = db.Column(db.Integer, primary_key=True) event_id = db.Column(db.Integer, db.ForeignKey('event.id')) # ... many fields ... event = db.relationship("Event", back_populates="event_data")當(dāng)我嘗試Event.query.filter(EventData.datetime>'2018-11-04')我得到這個 SQLSELECT every_column_from_event, every_column_from_event_data FROM event_data, event LEFT OUTER JOIN event_data AS event_data_1 ON event.id = event_data_1.event_id WHERE event_data.datetime > %s ORDER BY event_data_1.id DESC笛卡爾積 + OUTER JOIN,需要永遠運行。我也試過:Event.query.join(EventData).filter(EventData.datetime>'2018-11-04')這使:SELECT every_column_from_event, every_column_from_event_data FROM event INNER JOIN event_data ON event.id = event_data.event_id LEFT OUTER JOIN event_data AS event_data_1 ON event.id = event_data_1.event_id WHERE event_data.datetime > %s ORDER BY event_data_1.id DESC不再有笛卡爾積,而是 2 個連接,一個 INNER,一個 LEFT OUTER。如果我將我的加載技術(shù)更改為默認的lazy="select",我會得到查詢SELECT every_column_from_eventFROM event INNER JOIN event_data ON event.id = event_data.event_id WHERE event_data.datetime > %s這導(dǎo)致了 N+1 選擇問題。在我的情況下 N 可能非常大,所以不是一個選項。非常感謝您的幫助。
2 回答

千巷貓影
TA貢獻1829條經(jīng)驗 獲得超7個贊
的確。在第二個參數(shù)中輸入條件就可以了。
和...一起
join(...).options(contains_eager(Event.event_data))
以防止額外加入。
但我仍然認為這是一種解決方法,因為條件是“ON”子句的一部分,而不是“WHERE”子句的一部分。無論如何,它有效。謝謝。

慕村225694
TA貢獻1880條經(jīng)驗 獲得超4個贊
.join() 有一個可選的第二個參數(shù),作為一個 on 子句。所以我相信你正在尋找的是:
Event.query.join(EventData, EventData.datetime>'2018-11-04')
添加回答
舉報
0/150
提交
取消