【问题标题】:iterating over a postgresql table and updating rows from python [closed]迭代postgresql表并从python更新行[关闭]
【发布时间】:2014-04-28 22:47:29
【问题描述】:

我正在使用 python 3 和 psycopg2 连接到 postgresql 表。

表格有两列:第一列是一些变化的字符串,第二列是一个空字符串。

我想遍历所有行和每一行,读取第一列中的字符串,在其上计算一些 python 实现的函数,并用该结果更新第二列。

什么是最有效的(希望是惯用的)方法?

请假设我必须从 python 连接到数据库。

【问题讨论】:

  • 我正处于设计阶段。只是想要建议采取的方法
  • 设计建议 - 如果可能的话,无论计算是什么,都在 SQL 中而不是在 python 中进行。如果您可以在 SQL 中进行计算,那么您可以在一个 UPDATE 语句中完成所有操作。如果您必须在 python 中执行此操作,那么您的设计必须是查询所有行,并随时发布更新。
  • 如所强调的,我不能在 sql 中做到这一点,需要从 python 中做到这一点
  • @eyaler:你的问题并没有强调——甚至——你不能在 SQL 中做到这一点。
  • @eyaler 请问为什么你不能用 SQL 而不是 Python 来做呢?您可能会对可能发生的事情感到惊讶。此外,PostgreSQL 允许您拨打Python functions from SQL,这也可能是您的一个选择;它被称为plpython

标签: python postgresql


【解决方案1】:

最有效的方法可能是使用 COPY 将单个列转储到文本文件中,通过 python 提供它,截断表,然后使用 COPY 将生成的两列加载回。

【讨论】:

    【解决方案2】:

    如果不能在纯 SQL 中进行更新,我建议使用 命名的 psycopg 游标,它将分块您的选择查询。然后,您可以使用标准 Python for row in cursor 循环遍历游标,它会根据需要自动拉入新行(如果表很大,这将防止内存问题)。

    拥有一个索引以使每次更新都尽可能快也很重要(即使对于较小的表,需要 200 毫秒和 2 毫秒的顺序扫描加起来会很快)。

    最后,如果可能的话,我建议批处理提交,可能与命名光标的块大小(默认为 2000)结合使用,因为提交很昂贵,并且在每次行迭代后进行提交会很快加起来。

    您可以调整您的选择以仅拉入第二列为空字符串的行,以便如果您由于错误、新数据等原因想要多次运行代码,则可以重新启动代码。

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 2015-08-24
      • 2014-05-11
      • 2021-05-02
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多