为什么 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
我一直在使用 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