python - 如何使用 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,那么我需要增加E
和F
。
当您有 5 条记录时,这并不复杂,但是当您有数百万或数十亿条记录时,就会出现此问题。
解决方案
为了能够在序列中插入文档,
我手动创建了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_id
和new_id
-> id
。更新了具有所有属性(主键、唯一性等)的
新“创建”列。
丢弃的列。id
old_id
最后,插入所需的行。
总时间 - 几分钟,而不是几天。
找到适合我自己的解决方案。
如果有人知道如何优化手动步骤 - 欢迎您添加评论或编辑此答案。
推荐阅读
- python-2.7 - 传递函数,为什么需要 lambda
- r - 如何在 Rinto 数据框中解析复杂的 xml?
- firebase - 我想在本地调用 firestore 函数
- java - 将值插入二维数组
- php - Laravel:嵌入在 html 中的 {{url()}} 出错
- arrays - 给定一个包含 n 个元素和一个整数 k 的数组。将数组划分为子数组,每个子数组包含 k 个元素
- javascript - 有没有办法将电子表格信息链接到我的 HTML 文件中?
- r - 我正在尝试使用 qplot 进行绘图,但出现错误:stat_bin() 不得与任何美学一起使用
- pyspark - 在 jupyter notebook 上运行以下代码时出错
- javascript - 如何在两个自定义钩子之间共享状态?