使用 SqlAlchemy 在 for 循环中更新对象,这在理论上应该有效吗?

Posted

技术标签:

【中文标题】使用 SqlAlchemy 在 for 循环中更新对象,这在理论上应该有效吗?【英文标题】:Updating an object in a for loop using SqlAlchemy, should this work in theory? 【发布时间】:2011-03-24 12:20:28 【问题描述】:

所以首先我要获取行:

q = session.query(products)

for p in q:
    p.someproperty = 23

    session.commit()

以上理论上应该可行吗?还是那是错误的模式?

我收到一条错误消息,说不能修改属性,这很奇怪,所以我认为我做的事情根本上是错误的。

【问题讨论】:

【参考方案1】:

两件事:

第一,您不必在每次更改后都commit()。您应该能够:

for p in session.query (query):
    p.someproperty = somevalue
session.commit()

第二个,请在此处查看此线程:Efficiently updating database using SQLAlchemy ORM。这给出了另一个语法示例,并且接受的答案也提出了一种更好、更有效的方式来执行这种大规模更新。

【讨论】:

【参考方案2】:

您必须显式获取对象才能修改它们;您必须遍历 session.query(query_string).all() 。当然,在循环结束后进行一次提交会更有效。

【讨论】:

以上是关于使用 SqlAlchemy 在 for 循环中更新对象,这在理论上应该有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 合并()不使用烧瓶工作

Flask-SQLAlchemy with_for_update() 行锁

SQLAlchemy 循环依赖 - 如何解决?

选择语句上的 SQLAlchemy 内存占用

在Python类中使用for循环更新列表

在 Android 应用程序中使用 AsyncTask 在 for 循环期间更新 ProgressBar