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

标签 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) 返回“记录”的函数需要列定义列表

使用 f = sq.sql.func.doc_code(deviceId, type_=types.String) 我得到 No function matches the given name and argument types.您可能需要添加显式类型转换,并且生成的 SQL 是 SELECT doc_code('1') AS doc_code_1,而不是 SELECT * FROM

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

最佳答案

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

如果您确实需要使用 RETURNS SETOF RECORD 来执行此操作,则必须使用列定义列表来调用它,如错误消息所述:

a column definition list is required for functions returning "record"

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

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

关于postgresql - 使用 sqlalchemy 如何调用返回表的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21245354/

相关文章:

c# - NpgsqlCopyIn 因超时 ("CommandTimeout"设置而失败)

python - 单个表上的 SQLAlchemy 多对多关系错误 : NoReferencedTableError

sql-server - SQL Server -- 使用 OnNullCall 处理 CLR 用户定义函数 (UDF) 中的空输入

sql - 操作数类型冲突 : varchar is incompatible with User-Defined Table Type

postgresql - Postgresql 日语词典

python - 导入错误 : No module named 'django.contrib.gis.django'

python - SQLAlchemy:从特定用户的favorite_series中检索所有剧集

python - 我可以让 SQLAlchemy 在不重复完整的原始查询的情况下进行子查询预加载吗?

scala - Spark 数据帧内映射中结构数组的聚合

java - PostgreSQL - quartz JDBC-JobStoreTX - getTriggersForJob - ArrayIndexOutOfBoundsException