为了账号安全,请及时绑定邮箱和手机立即绑定

SQLAlchemy join - 无法获得准确的查询

SQLAlchemy join - 无法获得准确的查询

白衣非少年 2021-09-14 20:27:43
我快要疯了。我有一个使用 SQLAlchemy 的 Flask 应用程序。我想做一个我认为非常简单的查询: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")当我尝试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。如果我将我的加载技术更改为默认的lazy="select",我会得到查询SELECT every_column_from_eventFROM event INNER JOIN event_data ON event.id = event_data.event_id WHERE event_data.datetime > %s这导致了 N+1 选择问题。在我的情况下 N 可能非常大,所以不是一个选项。非常感谢您的帮助。
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

的确。在第二个参数中输入条件就可以了。

和...一起

join(...).options(contains_eager(Event.event_data))

以防止额外加入。

但我仍然认为这是一种解决方法,因为条件是“ON”子句的一部分,而不是“WHERE”子句的一部分。无论如何,它有效。谢谢。


查看完整回答
反对 回复 2021-09-14
?
慕村225694

TA贡献1880条经验 获得超4个赞

.join() 有一个可选的第二个参数,作为一个 on 子句。所以我相信你正在寻找的是:

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


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 308 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号