psycopg2:使用元组中的值更新表中的多行

2024-09-30 14:15:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用一个元组一次更新几行。 我知道了如何从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子句被解释为:

^{pr2}$

而不是:

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)

有更好的方法吗?在


Tags: namefromidrichardnewdbsqlmy
1条回答
网友
1楼 · 发布于 2024-09-30 14:15:34

This post给我指出了正确的方向。The documentationfor extras.execute_values还包含一个使用UPDATE子句的很好的示例。在

c = db.cursor()
update_query = """UPDATE my_table AS t 
                  SET name = e.name 
                  FROM (VALUES %s) AS e(name, id) 
                  WHERE e.id = t.id;"""

psycopg2.extras.execute_values (
    c, update_query, new_values, template=None, page_size=100
)

相关问题 更多 >

    热门问题