我正在从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)
-应该如何处理?
答案 0 :(得分:1)
字符串值是Postgresql复合(行)值的表示形式,因此,显然不打算将其视为Python文字。 Psycopg2可以处理复合类型值并将其适应Python值,但这需要使用创建的类型。在您的情况下,简单的解决方案是从表值函数中进行选择,而不是将其用作选择列表项:
result = connection.execute('SELECT * FROM "test"(\'123\')').fetchone()
print(result.project_name, result.projects_num)