当前位置: 首页 > 知识库问答 >
问题:

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

唐景山
2023-03-14

我试图用一个元组一次更新几行。我从这篇文章中了解了如何构造sql语句,但是在< code>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:表“e”有1列可用,但指定了2列。这是因为FROM子句被解释为:

FROM (VALUES (("Richard",29),("Ronald",30)))

而不是:

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)

有更好的方法吗?


共有1个答案

牧甫
2023-03-14

这篇文章为我指出了正确的方向。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
)
 类似资料:
  • 我试图弄清楚如何将值的元组插入到预定义的表中,而不需要像这样的简单语法: 因为我的元组具有如下正确的值序列: 我想知道一些简单的解决方案:-)比如: 由于我已经创建了表架构并且元组具有相同的属性序列,因此我认为这是可以做到的,而无需将所有参数逐个传递给cur.execute()

  • 问题内容: 我是python的新手,所以这个问题可能有点基本。我有一个元组,其中包含以下内容: 我想更改此元组中的第一个值(即),但我知道元组是不可变的,因此将不起作用。我该如何实现? 问题答案: 首先,您需要问,为什么要这样做? 但是可以通过: 但是,如果您需要进行更改,那么最好将其保留为

  • 问题内容: 如何从列表中的每个元组返回第二个值? 所需的输出: 问题答案: 具有列表理解能力。

  • 问题内容: 我读过这篇文章和同一个人的这篇文章,说您无法更新数组元素。 我还阅读了最近的一篇文章,有人说可以用某种方式完成此操作,但是我在文档中都无法获得有关stackoverflow的任何信息。 有什么办法可以解决这个问题?谢谢! 问题答案: 实际上,写这些答案的“家伙”是我:)那时,还没有一种更新数组元素的方法。只能存储数组,而 不能 更新数组成员。 现在,在更新文档时,您可以将第二个参数传递

  • 下面我有以下数据。 所以,我不知道为什么UDF可以使用int而不能使用CharArray。此外,我觉得可能有一种方法可以做到这一点,而不使用UDF..但不确定从哪里开始。对这里可能发生的事情有什么建议吗?

  • 本文向大家介绍计算Python中元组列表中的元组出现,包括了计算Python中元组列表中的元组出现的使用技巧和注意事项,需要的朋友参考一下 列表由元组组成。在本文中,我们将计算列表中存在的唯一元组的数量。 使用defaultdict 我们将给定列表视为defaultdict数据容器,并使用in条件对其中的元素进行计数。 示例 输出结果 运行上面的代码给我们以下结果- 带柜台和链条 计数器和链函数是