使用SQLAlchemy解压缩PostGIS/PostgreSQL记录

Iai*_*ham 5 postgresql postgis sqlalchemy

如何使用SQLAlchemy的ORM编写以下查询?

SELECT filename, (stats).*
FROM (
    SELECT filename, ST_SummaryStats(rast, 1, TRUE) AS stats FROM tiles
) AS stats_table;
Run Code Online (Sandbox Code Playgroud)

ST_SummaryStats是一个PostGIS函数,它返回我想要解压缩的记录.tiles是带有filenamerast(栅格)列的PostGIS表.我的尝试如下:

sub_q = db_session.query(
    Tiles.filename,
    func.ST_SummaryStats(Tiles.rast, 1, True).label('stats'),
).subquery()

q = db_session.query(
    sub_q.columns.filename,
    sub_q.columns.stats,
)
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何(stats).*使用SQLAlchemy的ORM 编写表达式 - 因此解压缩记录.因此,stats似乎是一个元组.

在此先感谢您的帮助.

Pat*_*ick 0

ST_SummaryStats()返回 a record,因此不要将其用作SELECT表达式(这将返回record),而是将其用作FROM子句并在该级别选择所需的统计信息SELECT,因此它变得非常简单:

SELECT filename, count, sum, mean, stddev, min, max
FROM tiles, ST_SummaryStats(tiles.rast, 1, true);
Run Code Online (Sandbox Code Playgroud)

这会导致所谓的LATERAL JOINand 由于ST_SummaryStats()只返回一行,rastertiles不需要连接条件、过滤器或其他任何内容。

我不确定 SQLAlchemy 是否能够将函数的结果用作类,但实现此目的的一个可靠方法是将以上内容包装SELECT到 a 中VIEW,然后从 SQLAlchemy 访问视图:

CREATE VIEW raster_stats AS
  SELECT filename, count, sum, mean, stddev, min, max
  FROM tiles, ST_SummaryStats(tiles.rast, 1, true);
Run Code Online (Sandbox Code Playgroud)