psycopg2 +存储过程+复合型

发布于 2024-12-17 10:13:08 字数 636 浏览 1 评论 0原文

我在 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 调用需要复合类型的存储过程呢?

I have a stored procedure in PostgreSQL that takes a t_document composite type defined as follows:

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

The stored procedure takes other arguments as well, with a signature like:

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

Calling this stored procedure from another stored procedure looks like this:

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

I know I can call procedures using cursor.callproc and give the required arguments. However, I don't know how to pass compound arguments like t_document. So how do I call a stored procedure from psycopg2 that expects a compound type?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

赏烟花じ飞满天 2024-12-24 10:13:08

您可以在元组中传递namephoneaddress,最终使用显式强制转换来更好地消除歧义:

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

您还可以使用namedtuple:它以同样的方式进行调整。

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

You can pass name, phone, and address in a tuple, eventually with an explicit cast to better disambiguate:

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

You could also use a namedtuple: it is adapted the same way.

Document = namedtuple('Document', 'title metadata data')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文