Postgresql 使Query.update正常工作
我正在使用SQLAlchemy v0.9.7开发一个应用程序,该应用程序构建一个需要从另一个源获取的数据项表,并将这些数据项与每个批处理作业将拉动的队列中的批处理作业相关联 大量的单个数据项 这似乎是执行批量更新查询的理想情况,因为我需要使用对每一行的相同更改来更新大量单独的行 所以我试着这样做:Postgresql 使Query.update正常工作,postgresql,python-2.7,sqlalchemy,Postgresql,Python 2.7,Sqlalchemy,我正在使用SQLAlchemy v0.9.7开发一个应用程序,该应用程序构建一个需要从另一个源获取的数据项表,并将这些数据项与每个批处理作业将拉动的队列中的批处理作业相关联 大量的单个数据项 这似乎是执行批量更新查询的理想情况,因为我需要使用对每一行的相同更改来更新大量单独的行 所以我试着这样做: for job_parameters in job_parameters_list: job = Job( **job_parameters ) session.add(job)
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,即使我在每次更新之后显式提交,并且我还尝试在每次更新之前和之后执行session.expire\u,如上所示。我还使用engine.echo=True查看了发出的SQL,它似乎是合理的,每次传递时都有一个新的job.id
我相当肯定我的代码的逻辑是正确的。如果我替换q.update。。。在所有要更新的行中都有一个显式的Python级循环,一切正常:
for row in q:
row.query_job_id = job.id
你们这些SQLAlchemy大师对如何正确执行更新有什么建议吗?以上内容不够具体。您看到的UPDATE语句是什么,WHERE标准是什么?如果您看到所有DataItems对象都获得相同的作业id,那听起来好像UPDATE语句正在匹配所有行,而不仅仅是您想要的行;然而,让我困惑的是,如果我用naive循环替换UPDATE语句,我相信它应该具有完全相同的语义,那么一切都会正常工作。这一切都与SQL发出的内容有关。最终,它只是向数据库发送命令。两种情况下的命令完全相同吗?谢谢,zzzeek。使用echo=True查看的命令并不完全相同,在这两种情况下,它们都足够复杂,以至于我无法发现明显的错误,例如在错误的点开始/提交。如果我的待办事项列表上有问题,构造一个最小的测试用例来说明问题。。。