如何通过SQLAlchemy从Postgres函数返回可读的结果?

时间:2018-12-06 19:58:06

标签: python postgresql sqlalchemy flask-sqlalchemy

我正在从Flask-SQLAlchemy调用Postgres函数。该函数返回一个具有2个值的表:字符串和数字:

CREATE OR REPLACE FUNCTION public.test (
  id varchar
)
RETURNS TABLE (
  project_name varchar,
  projects_num integer
) AS
$body$
DECLARE 
BEGIN    
...
RETURN QUERY (SELECT project.name as project_name, project_nums as projects_num);   
END;
$body$
LANGUAGE 'plpgsql'

在烧瓶方面,我正在打以下电话:

engine = create_engine(url)
connection = engine.connect()
result = connection.execute('SELECT "test"(\'123\')').fetchone()

然后我正试图从结果中获取数据。

for row in result:
    print(literal_eval(row))

这将引发异常,因为实际上行具有字符串:

(my_project, 3)

当然,它不知道my_project到底是什么。如何使其正确返回结果或正确处理结果?例如,它可以返回('my_project', 3)

我解决了这个问题,加上了括号

('"' || account_object.valid_status || '"')

但是它看起来糟透了,不敢相信没有正常的解决方法吗? Null的另一个问题-它只是不包含在元组中:(,0)-应该如何处理?

1 个答案:

答案 0 :(得分:1)

字符串值是Postgresql复合(行)值的表示形式,因此,显然不打算将其视为Python文字。 Psycopg2可以处理复合类型值并将其适应Python值,但这需要使用创建的类型。在您的情况下,简单的解决方案是从表值函数中进行选择,而不是将其用作选择列表项:

result = connection.execute('SELECT * FROM "test"(\'123\')').fetchone()
print(result.project_name, result.projects_num)