我将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/