Psygopg2用python元组列表替换多列

Psygopg2用python元组列表替换多列,python,sql,postgresql,psycopg2,Python,Sql,Postgresql,Psycopg2,我是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 doubl

我是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):

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.
它说它需要双精度,但得到了数字类型,我不知道如何解决。Mymeanstd_pop列是双精度列。这是怎么回事?

我解决了这个问题

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

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;
    '''

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

发布相关的Python代码。@ClodoaldoNeto Python代码有很多依赖项,但我实际上知道如何解决它。我只是将“双精度”替换为“数值”,但这与我的直觉相反,因为我将这些列声明为“双精度”。