我有一个Postgres程序,其返回类型为SETOF record
。该过程需要几个参数,包括一个参数,它是一个列表,两个是日期时间。我想从psycopg2调用这个过程。我收到此错误消息:
a column definition list is required for functions returning "record"
我们希望从存储过程返回的列是动态的(基于用户输入),因此我们不想使用out参数,RETURN TABLE,RETURN SETOF或其他任何需要声明返回类型的内容程序定义时间。使返回列动态化的唯一方法是:
https://stackoverflow.com/a/6085167/75857
使用psycopg调用返回一组记录的存储过程的最佳方法是什么?我们提出了这个似乎有效的代码,但不确定是否推荐:
cursor.execute("SELECT * FROM get_fnord(%s, %s, %s) as (foo integer, bar integer)", ([12561], start, end));
答案 0 :(得分:1)
我认为您的解决方案很好。它匹配 Postgres doc在 SELECT 语句的 FROM 子句中使用函数所显示的样式
他们的示例显示了使用和不使用列定义列表调用它:
CREATE FUNCTION distributors(int) RETURNS SETOF distributors AS $$
SELECT * FROM distributors WHERE did = $1;
$$ LANGUAGE SQL;
SELECT * FROM distributors(111);
did | name
-----+-------------
111 | Walt Disney
CREATE FUNCTION distributors_2(int) RETURNS SETOF record AS $$
SELECT * FROM distributors WHERE did = $1;
$$ LANGUAGE SQL;
SELECT * FROM distributors_2(111) AS (f1 int, f2 text);
f1 | f2
-----+-------------
111 | Walt Disney
似乎 psycopg2 (或者它包装的底层 libpq )需要后者的形式和定义。
文档链接:http://www.postgresql.org/docs/9.3/static/sql-select.html
答案 1 :(得分:0)
我想调用返回光标的postgres函数。
这是代码:
con = psycopg2.connect("connection string")
cur = con.cursor()
cur.execute("BEGIN")
cur.execute("SELECT * FROM **SP NAME WITH PARAMETER**;")
cur.execute("FETCH ALL from records;") // records is the cursor defined in function
items = cur.fetchall()