[英]Sqlalchemy duplicated WHERE clause to FROM
我向 psql 写了原始查询,它工作正常,但是当我在 sqlalchemy 中写这个时,我的 WHERE 子句复制到了 FROM 子句。
select id from T1 where arr && array(select l.id from T1 as l where l.box && box '((0,0),(50,50))');
在此查询中,我从 T1 获取所有 id,其中 int 数组与子查询的结果相交。
class T1():
arr = Column(ARRAY(Integer))
...
class T2():
box = Column(Box) # my geometry type
...
1个版本:
layers_q = select([T2.id]).where(T2.box.op('&&')(box)) # try find all T2 intersects with box
chunks = select([T1.id]).where(T1.arr.overlap(layers_q)) # try find all T1.id where T1.arr overlap with result from first query
SELECT T1.id
FROM T1
WHERE T1.arr && (SELECT T2.id
FROM T2
WHERE T2.box && %(box_1)s)
我有一个关于类型转换的 PG 错误。 我明白了。
2 版本:
layers_q = select([T2.id]).where(T2.box.op('&&')(box))
chunks = select([T1.id]).where(T1.arr.overlap(func.array(layers_q)))
我添加了func.array()用于强制转换为数组,但结果不正确:
SELECT T1.id
FROM T1, (SELECT T2.id AS id
FROM T2
WHERE T2.box && %(box_1)s)
WHERE T1.arr && array((SELECT T2.id
FROM T2
WHERE T2.box && %(box_1)s))
在那里你可以看到我在 FROM 子句中重复的内容。 怎么做的正确?
我找到解决方案!
func.array(select([T2.id]).where(T2.box.op('&&')(box)).as_scalar())
添加as_scalar() 后一切正常,因为在我的选择中,所有 id 都需要在一个数组中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.