使用SQLAlchemy从PostgreSQL行对象获取单个值

我正在将Python与SQLAlchemy(在我的特殊情况下为GeoAlchemy)一起使用,并且我有一个查询,该查询导致一行对象的单列。我希望从这些行对象中提取特定的值,但是SQLAlchemy将行对象解释为单个实体(如果我正确的话,将它们作为字符串返回)。如何在不使用Python解析它们的情况下更干净地获取这些单独的值?

我现实生活中的用例:PostgreSQL的PostGIS扩展提供了一个名为的功能ST_IsValidDetail。此函数旨在返回valid_detail一行,该行由boolean valid,stringreasonlocation发生无效的几何组成。因为我觉得这个问题比这更笼统,所以我放弃了PostGIS标签。我的查询类似于SELECT ST_IsValidDetail('POINT(1 1)'::GEOMETRY);(当然,具有更复杂的几何形状


慕少森
浏览 311回答 2
2回答

素胚勾勒不出你

您可以使用: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),以告诉解析器您所指的是一个值,而不是表名。演示: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) invokedNOTICE:  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) invokedNOTICE:  multirows(1) invokedNOTICE:  multirows(1) invokedNOTICE:  multirows(2) invokedNOTICE:  multirows(2) invokedNOTICE:  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) invokedNOTICE:  multirows(2) invoked a | b | c ---+---+--- 1 | 2 | 3 2 | 3 | 4(2 rows)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python