第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQLAlchemy join - 無法獲得準確的查詢

SQLAlchemy join - 無法獲得準確的查詢

白衣非少年 2021-09-14 20:27:43
我快要瘋了。我有一個使用 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”子句的一部分。無論如何,它有效。謝謝。


查看完整回答
反對 回復(fù) 2021-09-14
?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

.join() 有一個可選的第二個參數(shù),作為一個 on 子句。所以我相信你正在尋找的是:

Event.query.join(EventData, EventData.datetime>'2018-11-04')


查看完整回答
反對 回復(fù) 2021-09-14
  • 2 回答
  • 0 關(guān)注
  • 330 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號