我试图用一个元组一次更新几行。
我知道了如何从this post构造sql语句,但是在psycopg2
中实现它被证明是更具挑战性的。
以下是我所拥有的:
c = db.cursor()
new_values = (("Richard",29),("Ronald",30))
sql = """UPDATE my_table AS t
SET name = e.name
FROM (VALUES %s) AS e(name, id)
WHERE e.id = t.id;"""
c.execute(sql, (new_values,))
结果是一个错误:ProgrammingError: table "e" has 1 columns available but 2 columns specified
这是因为FROM
子句被解释为:
而不是:
FROM (VALUES ("Richard",29),("Ronald",30))
我可以通过执行以下操作来解决此问题,但这似乎不安全:
import re
c = db.cursor()
sql = """UPDATE my_table AS t
SET name = e.name
FROM (VALUES %s) AS e(name, id)
WHERE e.id = t.id;"""
sql = c.mogrify(sql, (new_values,))
# Replace the first occurance of '((' with '('.
sql = sql.replace('((', '(',1)
# Replace the last occurance of '))' with ')'.
sql = re.sub(r'(.*)\)\)', r'\1)', sql)
sql = c.execute(sql)
有更好的方法吗?在
This post给我指出了正确的方向。The documentationfor
extras.execute_values
还包含一个使用UPDATE
子句的很好的示例。在相关问题 更多 >
编程相关推荐