【问题标题】:How to increment multiple rows using SqlAlchemy如何使用 SqlAlchemy 增加多行
【发布时间】:2020-11-24 05:16:12
【问题描述】:

如何通过增加某些字段来更新多条记录(在我的情况下为id)?
我错过了一条记录,整个表格都发生了变化。

如何在一笔交易或一次查询中做到这一点?或者最快的方法是什么?

尝试了类似下面的方法,但是太慢了。

rows = session.query(Table).all()
for row in rows:
    row.id = row.id + 1
    session.commit()

也尝试使用类似的东西,但它不适合我:

session.query(Table)\
    .filter(Table.id == row.id)\
    .update({'id': row.id + 1})

我拥有的数据示例:

 ID   Value 
  1       A
  2       B
  3       C
               < -- D is missing here
  4       E
  5       F

这里,如果是字母表D 的 ID=4,那么我需要增加 EF

当你有 5 条记录时,这并不复杂,但当你有数百万或数十亿条记录时,就会出现这个问题。

【问题讨论】:

  • 你所说的“整个表移位”是什么意思?您是否知道 PostgreSQL 序列号/身份在设计上可能存在漏洞?请提供minimal reproducible example,在这种情况下是模型,以及您尝试实现的前后的一些示例数据。
  • @IljaEverilä 实际上我需要按固定顺序创建那个洞。因为我错过了在导入过程中创建一个对象。但是对象应该一个接一个。
  • @IljaEverilä 添加示例。

标签: python python-3.x postgresql python-2.7 sqlalchemy


【解决方案1】:

为了能够在序列中插入文档,
我手动创建了new_id 列并将其添加到Table 模型中

new_object_id = 4

session.query(Table) \
    .filter(Table.id < new_object_id)\
    .update({Table.new_id: Table.id})

session.query(Table) \
    .filter(Table.id >= new_object_id)\
    .update({Table.new_id: Table.id + 1})

在这些操作之后,您应该能够在 id-sequence 中看到一个“洞”。

然后,在单独的查询中,手动重命名列 id -> old_idnew_id -> id
更新了具有所有属性(主键、唯一性等)的新“创建”id 列。
已删除 old_id 列。

最后,插入所需的行。

总时间 - 几分钟,而不是几天。

找到适合我自己的解决方案。
如果有人知道如何优化手动步骤 - 欢迎您添加 cmets 或编辑此答案。

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2023-03-08
    • 1970-01-01
    • 2014-03-31
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    相关资源
    最近更新 更多