[英]Add alias to subquery in SQLAlchemy
在过去的2个小时里,这一直使我发疯:
我正在尝试查询重叠的多边形。 这与PostGIS函数很好地配合使用,但是我很难用SQLAlchemy编写此查询。
正确的SQL查询是:
SELECT id FROM track WHERE ST_Overlaps(
(
SELECT ST_GeomFromText(
'POLYGON((
16.15 47.25,
16.15 46.57,
13.85 46.57,
13.85 47.25,
16.15 47.25
))',
4326)
),
track.extent
);
( track.extent是一列,以地理格式保存多边形, ST_GeomFromText()创建与之比较的多边形)
我正在使用ORM,到目前为止,我的python代码看起来像这样:
viewport = select([func.ST_GeomFromText(('POLYGON(( \
16.15 47.25, \
16.15 46.57, \
13.85 46.57, \
13.85 47.25, \
16.15 47.25))' \
,4326))])
DBSession.query(Track.id).filter( \
func.ST_Overlaps(viewport, Track.extent)).all()
上面的代码由SQLAlchemy解释为以下SQL查询:
SELECT track.id AS track_id FROM track,
(SELECT ST_GeomFromText('
POLYGON((
16.15 47.25,
16.15 46.57,
13.85 46.57,
13.85 47.25,
16.15 47.25
))',
4326) AS "ST_GeomFromText_1"
)
WHERE ST_Overlaps(
(
SELECT ST_GeomFromText(
'POLYGON((
16.15 47.25,
16.15 46.57,
13.85 46.57,
13.85 47.25,
16.15 47.25
))',
4326) AS "ST_GeomFromText_1"
),
track.extent
);
产生错误:
ProgrammingError: (ProgrammingError) subquery in FROM must have an alias
LINE 2: FROM track, (SELECT ST_GeomFromText('POLYGON((16.15759034023...
^
HINT: For example, FROM (SELECT ...) [AS] foo.
我怎么能告诉SQLAlchemy的要么在FROM子句中摆脱不必要的视 -subquery或添加一个别名到视口 -查询?
我相信您正在寻找.label()
构造:
viewport = select([func.ST_GeomFromText(...)]).label("viewport")
然后,将其放在WHERE子句中也不会将其放在FROM子句中:
str(session.query(Track.id).filter(func.ST_Overlaps(viewport, Track.extent))
# 'SELECT track.id AS track_id \nFROM track \nWHERE ST_Overlaps((SELECT ST_GeomFromText(...) AS "ST_GeomFromText_1"), track.extent)'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.