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

Может быть, кто-то может объяснить, почему он должен быть числовым, а не двойной точности?

Другие вопросы по тегам