Массовое обновление строк в базе данных Postgres с помощью psycopg2 - PullRequest
0 голосов
/ 20 сентября 2019

Нам нужно выполнить массовое обновление многих строк в нашей базе данных Postgres, и мы хотим использовать синтаксис SQL ниже.Как нам это сделать, используя psycopg2?

UPDATE table_to_be_updated
SET msg = update_payload.msg
FROM (VALUES %(update_payload)s) AS update_payload(id, msg)
WHERE table_to_be_updated.id = update_payload.id
RETURNING *

Попытка 1 - Передача значений

Нам нужно передать вложенный итеративный формат в запрос psycopg2.Для update_payload я попытался передать список списков, список кортежей и кортежей кортежей.Все это дает сбой с различными ошибками.

Попытка 2 - Написание пользовательского класса с __conform __

Я пытался написать пользовательский класс, который мы можем использовать для этих операций,который вернул бы

(VALUES (row1_col1, row1_col2), (row2_col1, row2_col2), (...))

Я закодировал как это следующие инструкции здесь , но ясно, что я делаю что-то неправильно.Например, в этом подходе мне придется обрабатывать цитирование всех значений внутри таблицы, что будет громоздким и подвержено ошибкам.

class ValuesTable(list):
    def __init__(self, *args, **kwargs):
        super(ValuesTable, self).__init__(*args, **kwargs)

    def __repr__(self):
        data_in_sql = ""
        for row in self:
            str_values = ", ".join([str(value) for value in row])
            data_in_sql += "({})".format(str_values)
        return "(VALUES {})".format(data_in_sql)

    def __conform__(self, proto):
        return self.__repr__()

    def getquoted(self):
        return self.__repr__()

    def __str__(self):
        return self.__repr__()
...