gpt4 book ai didi

python - 在 SQLAlchemy 中使用 bulk_update_mappings 更新具有不同值的多行

转载 作者:IT老高 更新时间:2023-10-29 00:04:21 30 4
gpt4 key购买 nike

我有两张 table Foo 和 Bar。我刚刚在 Bar 表中添加了一个新列 x,它必须使用 Foo 中的值来填充

class Foo(Base):
__table__ = 'foo'
id = Column(Integer, primary_key=True)
x = Column(Integer, nullable=False)

class Bar(Base):
__table__ = 'bar'
id = Column(Integer, primary_key=True)
x = Column(Integer, nullable=False)
foo_id = Column(Integer, ForeignKey('foo.id'), nullable=False)

一种直接的方法是遍历 Bar 中的所有行,然后逐个更新它们,但这需要很长时间(Foo 和 Bar 中有超过 100k 行)

for b, foo_x in session.query(Bar, Foo.x).join(Foo, Foo.id==Bar.foo_id):
b.x = foo_x
session.flush()

现在我想知道这是否是正确的做法 -

mappings = []
for b, foo_x in session.query(Bar, Foo.x).join(Foo, Foo.id==Bar.foo_id):
info = {'id':b.id, 'x': foo_x}
mappings.append(info)
session.bulk_update_mappings(Bar, mappings)

没有太多关于 bulk_update_mappings 的示例。文档建议

All those keys which are present and are not part of the primary key are applied to the SET clause of the UPDATE statement; the primary key values, which are required, are applied to the WHERE clause.

因此,在这种情况下,id 将在 WHERE 子句中使用,然后使用字典中的 x 值进行更新对吧?

最佳答案

该方法在用法上是正确的。我唯一要改变的是像下面这样的东西

mappings = []
i = 0

for b, foo_x in session.query(Bar, Foo.x).join(Foo, Foo.id==Bar.foo_id):
info = {'id':b.id, 'x': foo_x}
mappings.append(info)
i = i + 1
if i % 10000 == 0:
session.bulk_update_mappings(Bar, mappings)
session.flush()
session.commit()
mappings[:] = []

session.bulk_update_mappings(Bar, mappings)

这将确保您没有太多数据卡在内存中,并且您不会一次向数据库执行太大的插入操作

关于python - 在 SQLAlchemy 中使用 bulk_update_mappings 更新具有不同值的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36272316/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com