使用 SQLAlchemy 解压缩 PostGIS/PostgreSQL 记录

Unpack a PostGIS/PostgreSQL record with SQLAlchemy

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

SELECT filename, (stats).*
FROM (
    SELECT filename, ST_SummaryStats(rast, 1, TRUE) AS stats FROM tiles
) AS stats_table;

这里,ST_SummaryStats是一个PostGIS函数,returns我要解包的记录。 tiles 是具有 filenamerast(栅格)列的 PostGIS table。我的尝试如下:

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,
)

但是,我不知道如何使用 SQLAlchemy 的 ORM 编写 (stats).* 表达式——从而解压记录。因此,stats 看起来是一个元组。

在此先感谢您的帮助。

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

SELECT filename, count, sum, mean, stddev, min, max
FROM tiles, ST_SummaryStats(tiles.rast, 1, true);

这会导致所谓的 LATERAL JOIN,因为 ST_SummaryStats() return 对于 tiles 中指示的 raster 只有一行不需要连接条件、过滤器或其他任何东西。

我不确定 SQLAlchemy 是否能够将函数的结果用作 class,但实现此功能的可靠方法是将上述 SELECT 包装成 VIEW 然后从 SQLAlchemy 访问视图:

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