如何解决函数将行类型返回为单个值,而不是每个字段一个值 后续问题
我唯一一次在 SO 上遇到类似问题是在 here,但建议的解决方案与我无关。
我调用了一个 Postgresql 函数,但它返回单个值而不是每个字段一个值,我可以访问它。我有一个表 "Words"
,它由一个主键 word
和其他字段组成。
这是函数:
CREATE OR REPLACE FUNCTION equal(s TEXT)
RETURNS "Word" AS $$
SELECT *
FROM "Word"
WHERE word = s;
$$
LANGUAGE sql;
result = db.session.query(func.equal("is")).first()
输出将是:'(is,... )'
而不是所需的输出:('is',...)
。
后续问题
按照建议,db.session.execute(f"SELECT * FROM equal('{w}');").first()
可以解决问题。不幸的是,如果没有找到结果,它会返回一个 None
的列表。我希望它改为返回 None
。我原始方法中的 query
对象执行此操作,但将输出作为字符串返回。
解决方法
调整函数调用,而不是函数。
要分解返回的(复合)行类型并获取单个列,请使用以下命令调用函数:
SELECT * FROM equal('is');
代替:
SELECT equal('is');
见:
要在找不到行时不返回任何内容而不是一行 NULL 值,请将其设置为返回设置的函数:
CREATE OR REPLACE FUNCTION equal(_s text)
RETURNS SETOF "Word" -- !
LANGUAGE sql AS
$$
SELECT *
FROM "Word"
WHERE word = _s;
$$;
dbfiddle here
同一个电话。
SETOF
修饰符表示该函数将返回一组项目,而不是单个项目。
所以它也可以返回一个空集合,即什么都没有。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。