繁体   English   中英

将别名添加到SQLAlchemy中的子查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM