为什么 Psycopg2 return 在存储过程中列出元组?

Why does Psycopg2 return list of tuples in with Stored Procedure?

我一直在使用 Psycopg2 成功地从 Postgres 读取存储过程并返回一个很好的元组,这很容易处理。例如...

    def authenticate(user, password):
        conn = psycopg2.connect("dbname=MyDB host=localhost port=5433 user=postgres password=mypwd")
        cur = conn.cursor()
        retrieved_pwd = None
        retrieved_userid = None
        retrieved_user = None
        retrieved_teamname = None
        cur.execute("""
                    select "email", "password", "userid", "teamname"
                    from "RegisteredUsers"
                    where "email" = '%s'
                    """ % user)
        for row in cur:
            print row

打印的行会给我 ('user@gmail.com ', '84894531656894hashedpassword5161651165', 36, 'test ')

然而,当我运行以下代码使用存储过程读取一行固定装置时,我得到(在我看来)一团糟。

    def get_from_sql(userid):
        conn = psycopg2.connect("dbname=MyDB host=localhost port=5433 user=postgres password=pwd")
        fixture_cursor = conn.cursor()
        callproc_params = [userid]
        fixture_cursor.execute("select sppresentedfixtures(%s)", callproc_params)
    for row in fixture_cursor:
        print row

结果输出:

('(5,"2015-08-28 21:00:00","2015-08-20 08:00:00","2015-08-25 17:00:00","Team ","Team ","Final ")',)

我已经研究了游标 class 并且无法理解为什么它对于存储过程会这样输出。在 Postgres 中执行时,输出在一个完美的元组中。使用 Psycopg2 添加到元组中,我不明白为什么?

如何更改此设置以获得整洁的元组?我提出的要求给出了这个结果,我有什么不明白的地方?

我已经尝试了 callproc 函数并得到了同样无用的输出。任何对此的想法都会很棒。

这是因为您 SELECT 直接使用函数的结果。你的函数 return 是一组东西,每个 "thing" 恰好是一个元组,所以你会得到一个字符串化元组列表。你要的是这个:

SELECT * FROM sppresentedfixtures(...)

但这不起作用,因为您会收到错误消息:

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

解决办法是return一个table代替:

CREATE OR REPLACE FUNCTION sppresentedfixtures(useridentity integer) RETURNS TABLE(
  Fixture_No int,
  Fixture_Date timestamp,
  ...
) AS
$BODY$
  select
    "Fixtures"."Fixture_No",
    "Fixtures"."Fixture_Date",
    ...
  from "Fixtures" ...
$BODY$ LANGUAGE sql