我正在使用SQLAlchemy(v0.9.7)来开发一个应用程序,该应用程序构建一个需要从另一个源获取的数据项表,并将这些数据项与队列中的批处理作业相关联(每个批处理作业将拉动 大量的个人数据项。)
这似乎是使用Query.update()
进行批量更新查询的理想情况,因为我需要更新大量单行,每行的更改都相同。
所以我试着这样做:
for job_parameters in job_parameters_list:
job = Job( **job_parameters )
session.add(job)
session.flush()
#session.expire_all() # IS THIS NEEDED?
q = edbs.query( DataItems ).filter( ... ).with_lockmode('update')
q.update(dict(query_job_id=job.id), synchronize_session=False)
#session.expire_all() # IS THIS NEEDED?
logger.debug("created job (id %d) with parameters: %s", job.id, str(job_parameters)
session.commit()
令我惊讶的是,这不起作用。通过(外部)for
循环多次迭代后,所有数据项都链接到相同的作业ID,即使我在每update
后明确提交(我也尝试在每次更新之前和之后都做session.expire_all()
,如上所示。我还查看了发出的SQL(engine.echo=True
),看起来是合理的,每次传递都有一个新的job.id
。
我很确定我的代码的逻辑是合理的。如果我将q.update(...)
行替换为要更新的所有行的显式Python级循环,那么一切正常:
for row in q:
row.query_job_id = job.id
你们中的任何一位SQLAlchemy大师都对让update
正确执行有任何建议吗?