带有 psycopg2 抛出错误的 unnest
Posted
技术标签:
【中文标题】带有 psycopg2 抛出错误的 unnest【英文标题】:unnest with psycopg2 throwing error 【发布时间】:2017-09-21 16:10:25 【问题描述】:我有以下 python 脚本将数据插入到 psql 中
from psycopg2 import connect
con = connect( """my string""")
query = """ INSERT INTO test.result_data
SELECT id,
result,
result1,
result2
FROM unnest(%s) s(id text, result real, result real, result integer)
"""
t = [('1234jc', 0.0, 1.2123, 1), ('1234sc', 1.0, 1.74, 1)]
c = con.cursor()
c.execute(query, (t,))
它正在抛出以下错误
psycopg2.ProgrammingError: function return row and query-specified return row do not match
DETAIL: Returned type unknown at ordinal position 1, but query expects text.
以下是数据库中的表结构
|---------------|-------|
|column name | type |
|---------------|-------|
|id | text |
|---------------|-------|
|result |float8 |
|---------------|-------|
| cpr |float8 |
|---------------|-------|
|cpr30 |float8 |
|---------------|-------|
【问题讨论】:
考虑对t
中的字符串值使用单引号。此外,您在列定义列表中重复 result
列
更新了报价,还是同样的问题
【参考方案1】:
您需要将这些数组转换为一种类型,因为 postgres 不知道如何将记录中的复合类型与列定义列表匹配。
CREATE TYPE f AS (col1 text, col2 real, col3 real, col4 int);
SELECT * FROM
UNNEST(
ARRAY[('1234jc', 0.0, 1.2123, 1), ('1234sc', 1.0, 1.74, 1)] :: f[]
);
在 Python 中
query = """ CREATE TYPE f AS (id text, result real, result1 real, result2 int);
INSERT INTO test.result_data
SELECT id,
result,
result1,
result2
FROM unnest(%s :: f[])
AS s(id text, result real, result1 real, result2 integer)
"""
【讨论】:
以上是关于带有 psycopg2 抛出错误的 unnest的主要内容,如果未能解决你的问题,请参考以下文章
错误:在 Docker 中的 Alpine 上安装 psycopg2 时找不到 pg_config 可执行文件
带有“%%”参数的 Postgres 查询未通过 psycopg2 返回结果
使用带有 Lambda 的 psycopg2 插入 Redshift (Python)