如何让SQLAlchemy识别json_each等隐式lateral join并消除笛卡尔积警告
你遇到的这个警告是因为没有显式声明表值函数json_each和EventHistory表的关联关系,SQLAlchemy误认为两者是独立的数据源,会生成笛卡尔积,所以抛出了SAWarning。
你之前的写法逻辑上是成立的,但缺少了显式的join关联,调整代码如下即可消除警告,功能完全不变:
term = 'connection' about_exp = func.json_each(EventHistory.event, '$.about').table_valued('value') # 显式执行join操作,SQLAlchemy会自动识别表值函数对主表字段的依赖 events = s.query(EventHistory).join(about_exp).filter(about_exp.c.value == term)
如果你使用的是1.4之前版本的SQLAlchemy,需要显式指定侧向连接(lateral join),写法如下:
from sqlalchemy import lateral term = 'connection' about_exp = lateral(func.json_each(EventHistory.event, '$.about').table_valued('value')) events = s.query(EventHistory).join(about_exp).filter(about_exp.c.value == term)
原理说明:json_each作为表值函数,其输入依赖EventHistory表每行的event字段,属于行级关联的计算结果,必须通过显式join和主表关联,SQLAlchemy才会识别到两者的绑定关系,不会误判为无关联的笛卡尔积查询。
内容的提问来源于stack exchange,提问作者Piotr Czapla
相关产品推荐
相关产品推荐

