postgresql 使用psycopg2调用接受自定义类型数组的postgres函数

yuvru6vn  于 2023-01-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(139)

我目前在postgres中有一个自定义类型:

create type times_type as
(
  start varchar,
  end   varchar,
  rate real
);

我还有一个函数,它接受一个times_type数组:

create function insert_data(times_values times_type[])

当我使用命名元组并使用callproc一次插入一个值时,它工作得很好,即:

Document = namedtuple('times_type', 'start 
                             end rate')

 cur.callproc('insert_data',
                     (Document('13:00', '16:00', 12.56))

但是现在函数需要一个数组,所以我尝试:

Document = namedtuple('times_type', 'start 
                             end rate')

 cur.callproc('insert_data',
                     ([Document('13:00', '16:00', 12.56),
                       Document('17:00', '18:00', 12.56),
                       Document('19:00', '20:00', 12.56)])

psycopg2给了我一个函数不存在的错误,在处理自定义类型的数组时,你有什么必须做的吗?

anauzrmj

anauzrmj1#

复合类型数组的问题在于它们必须显式转换,否则Postgres会将其视为record[]

Document = namedtuple('times_type', 'start end rate')

class DocumentAdapter:
    def __init__(self, x):
        self.adapted = psycopg2.extensions.SQL_IN(x)
    def prepare(self, conn):
        self.adapted.prepare(conn)
    def getquoted(self):
        return self.adapted.getquoted() + b'::times_type'

psycopg2.extensions.register_adapter(Document, DocumentAdapter)

cur.callproc('insert_data',
                     ([Document('13:00', '16:00', 12.56),
                       Document('17:00', '18:00', 12.56),
                       Document('19:00', '20:00', 12.56)],)) # comma added, this should be a tuple
                       
conn.commit();  # dont forget to commit

相关问题