【问题标题】:Psygopg2 replacing multiple columns with python lists of tuplesPsygopg2 用 python 元组列表替换多个列
【发布时间】:2017-03-18 18:24:16
【问题描述】:

我是 PostgreSQl 的新手。我将 Psycopg2 与 PostgreSQL 9.5.6 一起使用。我的更新 SQL 现在看起来像这样。我想使用 Psycopg2 使用 Python 元组列表更新多个列。

update_sql = '''
            UPDATE my_table
            SET size = n, mean = m, std_pop = std
            FROM unnest(%s) s(my_id integer, n integer, m double precision, std double precision)
            WHERE my_table.id = s.my_id;
        '''

例如,我在 python 中有以下元组 (id, new_size, new_mean, new_std) 的 Python 列表:

new_column_values =[(0,10,9.0,8.0),(1,10,9.0,8.0),(2,10,9.0,8.0)]

我想放入表中并同时更新所有 3 列:

+----+------+------+---------+
| id | size | mean | std_pop |
+----+------+------+---------+
|  0 |    0 |    0 |       0 |
|  1 |    0 |    0 |       0 |
|  2 |    0 |    0 |       0 |
+----+------+------+---------+

这是更新多列的最佳方式吗?现在它返回一个错误:

psycopg2.ProgrammingError: function return row and query-specified return row do not match
DETAIL:  Returned type numeric at ordinal position 3, but query expects double precision.

它说它需要双精度,但有数字类型,我不知道如何解决。我的 meanstd_pop 列是双精度列。这是怎么回事?

【问题讨论】:

  • 贴出相关的Python代码。
  • @ClodoaldoNeto python代码有很多依赖,但我实际上想出了如何解决它。我只是将“双精度”替换为“数字”,但这对我来说是违反直觉的,因为我将这些列声明为“双精度”。

标签: python sql postgresql psycopg2


【解决方案1】:

我解决了这个问题。

我刚刚将更新查询中的 双精度 更改为 numeric 并解决了问题。但是当我用 双精度 声明列时,为什么我必须使用 numeric 是没有意义的。

update_sql = '''
        UPDATE my_table
        SET size = n, mean = m, std_pop = std
        FROM unnest(%s) s(my_id integer, n integer, m numeric, std numeric)
        WHERE my_table.id = s.my_id;
    '''

也许有人可以解释为什么它必须是数字而不是双精度

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多