Нам нужно выполнить массовое обновление многих строк в нашей базе данных 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__()