让Query.update正常工作

时间:2014-08-25 22:31:04

标签: postgresql python-2.7 sqlalchemy

我正在使用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正确执行有任何建议吗?

0 个答案:

没有答案