python - SQLAlchemy join - 不可能得到准确的查询
问题描述
我快疯了。我有一个使用 SQLAlchemy 的 Flask 应用程序。我想做一个我认为非常简单的查询:
SELECT * FROM event e
LEFT JOIN event_data ed on e.id = ed.event_id
WHERE 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')
我得到这个 SQL
SELECT 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
Cartesian Product + 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_event
FROM event
INNER JOIN event_data ON event.id = event_data.event_id
WHERE event_data.datetime > %s
这导致了 N+1 选择问题。在我的情况下,N 可能非常大,所以不是一个选择。
非常感谢您的帮助。
解决方案
推荐阅读
- reactjs - react-i18next addResourceBundle 不是函数
- ios - SwiftUI Header 标题覆盖行视图
- blockchain - 来自 txn 哈希的区块链 bscscan 农业对信息
- python - 如何只允许更新 1 个字段?
- firebase - 使用 agora 和 firebase flutter 进行语音通话
- python - 为什么这种欧式距离计算方法会爆炸 RAM 使用量?
- nginx - 带有 SSL、TSL、DHE、RSA 和 ECDSA 的 Nginx 多重反向代理
- reactjs - 加载新屏幕但停留在一页上的按钮
- python - 如何在不使用 scipy 的情况下计算累积概率函数?
- c# - 无法连接到 cloudpool elasticserach