为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕少森 2021-03-17 13:12:50
我正在将Python与SQLAlchemy(在我的特殊情况下为GeoAlchemy)一起使用,并且我有一个查询,该查询导致一行对象的单列。我希望从这些行对象中提取特定的值,但是SQLAlchemy将行对象解释为单个实体(如果我正确的话,将它们作为字符串返回)。如何在不使用Python解析它们的情况下更干净地获取这些单独的值?我现实生活中的用例:PostgreSQL的PostGIS扩展提供了一个名为的功能ST_IsValidDetail。此函数旨在返回valid_detail一行,该行由boolean valid,stringreason和location发生无效的几何组成。因为我觉得这个问题比这更笼统,所以我放弃了PostGIS标签。我的查询类似于SELECT ST_IsValidDetail('POINT(1 1)'::GEOMETRY);(当然,具有更复杂的几何形状
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您可以使用:


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


查看完整回答
反对 回复 2021-03-24
  • 2 回答
  • 0 关注
  • 310 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号