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

PSCOPG2:用一个查询更新多行

罗茂实
2023-03-14

我尝试通过实现以下函数,使用单个查询更新多行(约 350000):

def update_items(rows_to_update):
    sql_query = """UPDATE contact as t SET
                    name = e.name
                    FROM (VALUES %s) AS e(id, name)
                    WHERE e.id = t.id;"""

    conn = get_db_connection()
    cur = conn.cursor()

    psycopg2.extras.execute_values (
    cur, sql_query, rows_to_update, template=None, page_size=100
    )

尝试运行上述函数时,仅更新了 31 条记录。然后,我尝试使用以下函数逐行更新:

def update_items_row_by_row(rows_to_update):
    sql_query = """UPDATE contact SET name = %s WHERE id = %s"""
    conn = get_db_connection()
    with tqdm(total=len(rows_to_update)) as pbar:
        for id, name in rows_to_update:
            cur = conn.cursor()
            # execute the UPDATE  statement
            cur.execute(sql_query, (name, id))
            # get the number of updated rows
            # Commit the changes to the database
            conn.commit()
            cur.close()
            pbar.update(1)

后者迄今已更新了所有记录,但速度很慢(估计将在9小时内结束)。有人知道更新多个记录的有效方法吗?

共有1个答案

西门安宁
2023-03-14

通过将列表分割成大小等于page_size的块,效果很好:

def update_items(rows_to_update):
    sql_query = """UPDATE contact as t SET
                    name = data.name
                    FROM (VALUES %s) AS data (id, name)
                    WHERE t.id = data.id"""
    conn = get_db_connection()
    cur = conn.cursor()
    n = 100
    with tqdm(total=len(rows_to_update)) as pbar:
        for i in range(0, len(rows_to_update), n):
            psycopg2.extras.execute_values (
            cur, sql_query, rows_to_update[i:i + n], template=None, page_size=n
            )
            conn.commit()
            pbar.update(cur.rowcount)
    cur.close()
    conn.close()
 类似资料:
  • 问题内容: 我在这里找到了一些可以更新一个字段的东西:http : //www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different- values-and-a-single-sql- query/ 我的问题是如何更新多个字段?如: 这当然是行不通的。尝试了其他几种组合并失败了。任何的想法?谢谢! 问题答案:

  • 本文向大家介绍MongoDB中一次查询更新多个文档,包括了MongoDB中一次查询更新多个文档的使用技巧和注意事项,需要的朋友参考一下 要通过单个查询更新许多文档,请在MongoDB中使用 bulkWrite()。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是使用MongoDB中的一个查询来更新许多文档的查询- 在find()方法的帮助

  • 我需要更新我的数据库,它是基于locationId的多行软删除 当我运行查询时,我得到一个错误: 错误代码:1175。您使用的是安全更新模式,并且您试图更新一个没有使用键列禁用安全模式的表,请在“首选项”中切换该选项- 正如我所知,子查询将返回两条记录,因为子查询返回两条记录更新不会发生,但我如何解决这个问题。我试图解决这个问题,但没有成功。

  • 我需要根据一个子查询的结果更新一个表,该子查询带来了1个以上的值,但在下面的查询中,我得到错误返回“subquery returns mouth 1 row”。我想知道是否有可能做一个“循环”,以更新值与我下面的子查询中呈现的每个结果。 完成查询 返回2个或更多值的子查询。 结果 在理想的场景中,我的查询将执行第一个值,在第二个之后...第三个之后...而不重复前面的值。

  • 问题内容: 我发现了具有正确答案的类似问题。但是它们对我来说有点复杂。我只想要一个简单的基本声明。 我有: …和: 如何合并它们? 问题答案: 有关OUTPUT子句的更多信息,请查看此文章。

  • 我希望在一条语句中更新PostgreSQL中的多行。有没有一种方法可以做到以下几点?