psycopg2 + 存储过程 + 复合类型
我在PostgreSQL中有一个存储过程,它接受一个叫做t_document
的复合类型,这个类型的定义如下:
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中调用一个需要复合类型的存储过程呢?
1 个回答
3
你可以把 name
(名字)、phone
(电话)和 address
(地址)放在一个元组里,最后可以通过明确的转换来让它们更清晰:
cur.execute("sp_insertItem(%s, %s, %s, %s::t_document)",
['Name', 'Phone', 'Address', ('Title', 'Metadata', 'Data')])
你也可以使用命名元组(namedtuple):它的用法和这个差不多。
Document = namedtuple('Document', 'title metadata data')