我将Python与SQLAlchemy(在我的特殊情况下是GeoAlchemy)一起使用,并且我有一个查询,它将生成一列行对象。我希望从这些行对象中提取特定值,但是SQLAlchemy将行对象解释为单个实体(如果我是正确的,则将它们作为字符串返回)。如果不在Python中解析这些单独的值,我如何才能更干净地获取它们?
我的真实生活用例:
PostgreSQL的PostGIS扩展提供了一个名为ST_IsValidDetail的函数。此函数用于返回一个valid_detail行,该行由布尔值valid、字符串reason和一个发生无效的几何体location组成。因为我觉得这个问题比那个问题更普遍,所以我把PostGIS标签去掉了。我的查询类似于SELECT ST_IsValidDetail('POINT(1 1)'::GEOMETRY);(当然是更复杂的几何)。

最佳答案

您可以使用:

SELECT (ST_IsValidDetail(the_value)).* FROM the_table;

... 但不幸的是,PostgreSQL实际上对每一行执行一次ST_IsValidDetail函数。作为一种解决方法,您可以稍微更改查询,通过公共表表达式具体化,然后在第二次过程中提取元组:
WITH interim_result(v) AS (
    SELECT ST_IsValidDetail(the_value) FROM the_table
)
SELECT (v).* FROM interim_result;

(v)周围的paren需要告诉解析器您所指的是一个值,而不是一个表名。
演示:
CREATE OR REPLACE FUNCTION multirows(x IN integer, a OUT integer, b OUT integer, c OUT integer) AS
$$
BEGIN
    RAISE NOTICE 'multirows(%) invoked', x;
    a := x;
    b := x+1;
    c := x+2;
    RETURN;
END;
$$ LANGUAGE plpgsql;

craig=> SELECT multirows(x) FROM generate_series(1,2) x;
NOTICE:  multirows(1) invoked
NOTICE:  multirows(2) invoked
 multirows 
-----------
 (1,2,3)
 (2,3,4)
(2 rows)

craig=> SELECT (multirows(x)).* FROM generate_series(1,2) x;
NOTICE:  multirows(1) invoked
NOTICE:  multirows(1) invoked
NOTICE:  multirows(1) invoked
NOTICE:  multirows(2) invoked
NOTICE:  multirows(2) invoked
NOTICE:  multirows(2) invoked
 a | b | c 
---+---+---
 1 | 2 | 3
 2 | 3 | 4
(2 rows)




craig=> WITH interim(v) AS (SELECT multirows(x) FROM generate_series(1,2) x)
SELECT (v).* FROM interim;
NOTICE:  multirows(1) invoked
NOTICE:  multirows(2) invoked
 a | b | c 
---+---+---
 1 | 2 | 3
 2 | 3 | 4
(2 rows)

关于python - 使用SQLAlchemy从PostgreSQL行对象获取单个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16578014/

10-09 17:40