【发布时间】:2016-07-16 07:13:39
【问题描述】:
我有两张桌子 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 上的例子不多。文档建议
所有存在且不属于主键的键 应用于 UPDATE 语句的 SET 子句;主键 需要的值应用于 WHERE 子句。
那么,在这种情况下,id 将在 WHERE 子句中使用,然后使用字典中的 x 值进行更新,对吗?
【问题讨论】:
-
@Chris,我认为这对你有用,你只是想确保从方法的角度来看方法是正确的?
-
是的,正是……
标签: python mysql sqlalchemy