带有 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的主要内容,如果未能解决你的问题,请参考以下文章

带有简单列表的 psycopg2 executemany?

错误:在 Docker 中的 Alpine 上安装 psycopg2 时找不到 pg_config 可执行文件

带有“%%”参数的 Postgres 查询未通过 psycopg2 返回结果

使用带有 Lambda 的 psycopg2 插入 Redshift (Python)

在哪里可以下载带有 psycopg2 for Windows 的二进制鸡蛋?

使用带有 psycopg2 的二进制 COPY 表 FROM