У меня есть хранимая процедура в 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, которая ожидает составной тип?
Вы можете передать 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')