【问题标题】:Unpack a PostGIS/PostgreSQL record with SQLAlchemy使用 SQLAlchemy 解压 PostGIS/PostgreSQL 记录
【发布时间】:2015-04-16 22:44:07
【问题描述】:

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

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

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: postgresql sqlalchemy postgis


    【解决方案1】:

    ST_SummaryStats() 返回一个record,因此不要将其用作SELECT 表达式(这将返回record),而是将其用作FROM 子句并在@987654326 处选择所需的统计信息@level,所以就变得很简单了:

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

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

    我不确定 SQLAlchemy 是否能够将函数的结果用作类,但实现这项工作的可靠方法是将上述 SELECT 包装到 VIEW 中,然后从SQLAlchemy:

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

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 2021-12-25
      • 2021-07-02
      • 2017-10-07
      • 2015-04-28
      • 1970-01-01
      • 2011-01-02
      • 2011-09-05
      • 2018-04-17
      相关资源
      最近更新 更多