如何更新SqlAlchemy中所有行的一列数据?

Dip*_*iya 6 python mysql flask flask-sqlalchemy

对于单个记录更新,我尝试了以下代码并且它正在运行.

uid=1

info = Info.query.filter_by(id=uid).first()
info.sold_status ='1'
db.session.add(info)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

现在我想为多行更新一列.我试过了:

for row in db.session.query(Uninstall.status).all():
     print row.status

abc=row.status
abc=uid

db.session.add(row.status)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

提前致谢 :)

ant*_*uan 17

建议未优化.您可以使用选项进行更新:1.

for row in Uninstall.query:  # all() is extra
    row.status = new_status
Session.commit()
Run Code Online (Sandbox Code Playgroud)

如果有很多行,它可以更快,但它会UPDATE为每一行调用.不好,是吗?

2.

Uninstall.query.update({Uninstall.status: new_status}) 
Session.commit()
Run Code Online (Sandbox Code Playgroud)

仅为UPDATE所有行调用一个查询.


pck*_*ko1 5

2021年答案

sqlalchemy==1.4即将发布的 版本开始2.0,推荐的执行方法UPDATE是通过 SA 内置update函数,而不是.update方法。

例子:

from sqlalchemy import update

uid=1

# MY_CONDITION is whatever condition triggers the change in status value
update(Uninstall).where(MY_CONDITION).values(status=uid)
Run Code Online (Sandbox Code Playgroud)

如果您想将所有列的值更改为等于status,那么您可以简单地无条件地执行此操作:uid

update(Uninstall).values(status=uid)
Run Code Online (Sandbox Code Playgroud)

最后,不要忘记承诺:

session.commit()
Run Code Online (Sandbox Code Playgroud)

来源:https://docs.sqlalchemy.org/en/14/core/dml.html ?highlight=update#sqlalchemy.sql.expression.update