使用sqlalchemy如何调用返回表的函数

时间:2014-01-20 22:20:27

标签: postgresql sqlalchemy user-defined-functions postgresql-9.2

我找不到从返回TABLE的postgres函数返回数据的方法:

CREATE OR REPLACE FUNCTION doc_codes(device_id TEXT) RETURNS TABLE("name" TEXT, "suffix" TEXT) AS $$
    SELECT name, prefix_fordevice(name,  device_id) AS pf FROM doccode;
$$ LANGUAGE SQL;

使用:

    f = sq.sql.text("SELECT name, suffix FROM doc_codes(:deviceId)")

    return self.con.execute(f, deviceId=deviceId)

或者

    f = sq.sql.func.doc_codes(deviceId, type_=types.String)

    return self.con.execute(
        select([sq.Column('name', types.String), sq.Column('suffix', types.String)]). \
            select_from(f)
    ).fetchall()

我收到错误(ProgrammingError) a column definition list is required for functions returning "record"

使用f = sq.sql.func.doc_code(deviceId, type_=types.String)我得到No function matches the given name and argument types. You might need to add explicit type casts和生成的SQL is SELECT doc_code('1') AS doc_code_1,而不是SELECT * FROM

如果生成一个表,我无法将deviceId传递给表名...现在我可以做什么?

1 个答案:

答案 0 :(得分:1)

函数定义实际上必须RETURNS SETOF RECORD而不是RETURNS TABLE才能产生该错误。

如果您确实需要使用RETURNS SETOF RECORD,则必须使用列定义列表调用它,如错误消息所示:

  

返回“记录”的函数需要列定义列表

the documentation。您可以使用OUT参数(相当于RETURNS TABLE),也可以使用列表调用,例如:

SELECT name, suffix
FROM doc_codes(:deviceId) AS dc("name" TEXT, "suffix" TEXT)