【发布时间】:2013-10-14 23:45:54
【问题描述】:
我有两个相关的表已经填充了数据(使用 SQLAlchemy ORM)。但是,目前尚未链接各个记录,即外键列留空。我需要根据不同列的匹配来批量更新外键列。
举例说明:
class Location(Base):
__tablename__ = 'locations'
id = Column(Integer, primary_key=True)
x = Column(Float)
y = Column(Float)
class Stopover(Base):
__tablename__ = 'stopovers'
id = Column(Integer, primary_key=True)
x = Column(Float)
y = Column(Float)
location_id = Column(Integer, ForeignKey("locations.id"))
location = relationship("Location", backref=backref("stopovers"))
因此,基本上,我需要通过匹配“x”和“y”列,将 20,000 多个“中途停留”记录中的每一个与“位置”相关联 - 即批量更新 location_id 列。
此代码正确生成_location_id_:
for stpvr in session.query(Stopovers).all():
stpvr.location_id = session.query(Location.id).\
filter_by(x=stpvr.x).\
filter_by(y=stpvr.y).one()[0]
session.commit()
但是,它似乎不起作用 - 通过 Sqliteman 探索数据库显示 location_ids 尚未更新。此外,我猜肯定有更优雅的方法来解决这个问题。
在文档中,我发现 Correlated Updates 最接近我正在寻找的内容。但是,文档仅引用 SQL 表达式语言,而我使用的是 ORM。我是 SQLAlchemy 的新手,我尝试将文档转换为 ORM 的尝试没有成功。
如果能帮助我找到执行此批量更新的最优雅方式,我将不胜感激。提前致谢。
【问题讨论】:
标签: python sqlite orm sqlalchemy correlated