Psygopg2 заменяет несколько столбцов списками кортежей Python
Я новичок в PostgreSQl. Я использую Psycopg2 с PostgreSQL 9.5.6. Мой обновленный SQL выглядит так прямо сейчас. Я хочу обновить несколько столбцов с помощью списка кортежей Python, используя Psycopg2.
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.
Он говорит, что ожидает двойной точности, но получил числовой тип, который я не знаю, как решить. Мои средние значения и столбцы std_pop являются столбцами двойной точности. Что тут происходит?
1 ответ
Я решил проблему.
Я просто изменил двойную точность в своем запросе на обновление, чтобы решить эту проблему. Но это не имеет смысла, почему я должен использовать числовой, когда я объявил столбец с двойной точностью.
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;
'''
Может быть, кто-то может объяснить, почему он должен быть числовым, а не двойной точности?