2011-11-21 67 views
1

我PostgreSQL中有一个存储过程,需要定义为t_document复合类型如下:psycopg2 +存储过程+化合物类型

CREATE TYPE t_document AS (
    title text, 
    metadata text, 
    data  text 
); 

存储过程采用其他的参数,以及,与像签名:

CREATE or REPLACE FUNCTION sp_insertItem 
(
    name varchar(100) , 
    phone varchar(100) , 
    address varchar(150) , 
    document t_document 
) 

调用从另一个存储过程该存储过程是这样的:

sp_insertItem('Name','Phone', 'Address', row('Title', 'Metadata', 'Data')); 

我知道我可以使用cursor.callproc来调用过程并给出所需的参数。但是,我不知道如何传递像t_document这样的复合参数。那么如何从psycopg2调用一个预期复合类型的存储过程呢?

回答

3

你可以通过namephone,并且address在一个元组,最终以显式类型转换,以更好地消除歧义:

cur.execute("sp_insertItem(%s, %s, %s, %s::t_document)", 
    ['Name', 'Phone', 'Address', ('Title', 'Metadata', 'Data')]) 

你也可以使用一个namedtuple:它适用同样的方式。

Document = namedtuple('Document', 'title metadata data')