gpt4 book ai didi

python - 使用 psycopg2 将类型转换应用于参数中的数组项

转载 作者:行者123 更新时间:2023-12-05 04:43:20 35 4
gpt4 key购买 nike

问题

我正在努力将数据插入到 Python 中包含自定义数据类型数组列的表中。

方案如下:

CREATE TYPE data_source AS ENUM ('smtp', 'ftp', 'http');
CREATE TABLE IF NOT EXISTS data(
id BIGSERIAL PRIMARY KEY,
foo TEXT NOT NULL,
sources data_source[]
);

然后,我想使用 psycopg2 从 Python 将一些数据插入到这样的表中:

foo = "my_text"
sources = ["ftp", "http"]

cursor.execute(
"""
INSERT INTO data(foo, sources)
VALUES (%s, %s)
""",
(foo, sources),
)

此代码以运行时异常结束:

LINE 3: ...('my text', ARRAY['ftp...
^
HINT: You will need to rewrite or cast the expression.

我知道我需要调用 ::data_source 类型转换到 ARRAY 的每个元素。我怎样才能做到这一点?

带有 class 和 adapt() 的变体

我试图利用 psycopg2.extensions 包中的 adapt 函数

class Source:
def __init__(self, source):
self.string = source


def adapt_source(source):
quoted = psycopg2.extensions.adapt(source.string).getquoted()
return psycopg2.extensions.AsIs(f"{quoted}::data_source'")


psycopg2.extensions.register_adapter(Source, adapt_source)

foo = "my_text"
sources = [Source("ftp"), Source("http")]

cursor.execute(
"""
INSERT INTO data(foo, sources)
VALUES (%s, %s)
""",
(foo, sources),
)

但是这段代码以:

结尾
psycopg2.errors.SyntaxError: syntax error at or near ""'ftp'""
LINE 3: ...my text', (b"'ftp'"::...
^

我猜问题出在 AsIs 函数中,它结合了 getquoted 函数中的 bytes 和格式化的 string

任何人都可以帮助我或指出任何解决方案吗?

谢谢

最佳答案

扩展 Adrian Klaver 的答案,您还需要转换到您在架构中定义的数据库类型data_source

cur.execute(
"""
INSERT INTO data(foo, sources)
VALUES (%s, %s::data_source[])
""",
(foo, sources),
)
con.commit()

这对我有用。

关于python - 使用 psycopg2 将类型转换应用于参数中的数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69622944/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com