【问题标题】:Updating specific row in SQLAlchemy更新 SQLAlchemy 中的特定行
【发布时间】:2014-04-03 18:34:07
【问题描述】:

我将 SQLAlchemy 与 python 一起使用,我想更新表中与此查询相等的特定行:

UPDATE User SET name = 'user' WHERE id = '3'

我用 sql alchemy 编写了这段代码,但它不起作用:

session.query(User).filter(User.id==3).update({'name': 'user'})

返回此错误:

InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.

我该怎么做?

【问题讨论】:

    标签: python mysql sql sqlalchemy


    【解决方案1】:

    通常,你不使用update(),你设置属性:

    a_user = session.query(User).filter(User.id == 3).one()
    a_user.name = "user"
    session.commit()
    

    【讨论】:

    • 题外话:ormically 是什么意思? :)
    • @RayLuo,我怀疑ormically 的意思是“在利用 ORM 编码方法时”——本质上,通过 SQL Alchemy 将数据库对象作为 Python 对象利用,而不是构造查询来操作数据。
    • @bsplosion @RayLuo SqlAlchemy 库的主要“区域”,即“表达式”层,它以非常面向 sql 的关系样式运行;以及构建在表达式层之上的“orm”层,它将 sql 表“映射”到 python 类。 “ormically”会使用 sqlalchemy 的后半部分来做事,但 update() 属于前者。
    【解决方案2】:

    session.query(User).filter(User.id==3).update({'name':'user'},synchronize_session=False)

    这会奏效。在 sqlalchemy 文档中了解 syncrhonize_session

    【讨论】:

    • 你的评论救了我。我使用了synchronize_session='fetch',它首先查询数据,然后再在数据库上运行更新。本来希望它立即运行更新并让数据库决定是否应用更新命令。
    • 奇怪的是,如果我使用此代码,我通常会得到:update() got an unexpected keyword argument 'name'
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多