我们需要对Postgres DB中的许多行进行批量更新,并希望使用以下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__()
编辑: 如果有比我原问题中的语法更快/更清洁地进行批量更新的方法,则请告诉我!
['tbl1','msg1','tbl2','msg2']
作为命名参数“vars”执行你的查询(VALUES (%s, %s), (%s, %s), ...)
是否已经帮助你了? - Yannic Hamann