我是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中有以下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.
它说它需要双精度,但是有数字类型,我不知道如何解决。我的平均值和 std_pop 列是双精度列。这里发生了什么?
答案 0 :(得分:0)
我解决了这个问题。
我刚刚在更新查询中将双精度更改为数字,这解决了问题。但是当我用双精度声明列时,为什么我必须使用数字是没有意义的。
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;
'''
也许有人可以解释为什么它必须是数字而不是双精度?