首页 > 解决方案 > 如何使用 SqlAlchemy 增加多行

问题描述

如何通过增加某些字段(在我的情况下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 条记录时,这并不复杂,但是当您有数百万或数十亿条记录时,就会出现此问题。

标签: pythonpython-3.xpostgresqlpython-2.7sqlalchemy

解决方案


为了能够在序列中插入文档,
我手动创建了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

最后,插入所需的行。

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

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


推荐阅读