psycopg2 + 存储过程 + 复合类型

1 投票
1 回答
2590 浏览
提问于 2025-04-17 06:44

我在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')

撰写回答