【问题标题】:How can I get the list of affected rows (objects) when sending an update query with SLAlchemy?使用 SQLAlchemy 发送更新查询时,如何获取受影响行(对象)的列表?
【发布时间】:2022-10-15 00:53:16
【问题描述】:

我希望使用update 查询更新多个项目/行/对象。但是这个查询在执行后似乎没有返回任何对象。如何取回受影响对象的列表。例如,使用这样的查询:

session.query(my_model).filter(
    my_model.status == 'OK',
    my_model.is_validated == True,
    my_model.expires_at <= plum_dt.now(),
).update({'status':'EXPIRED'})

我希望用更新的对象取回列表。如果我只是在查询末尾添加all(),它不会返回任何内容。

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    你试试这个?:

     qry = session.query(my_model).filter(
           my_model.status == 'OK',
           my_model.is_validated == True,
           my_model.expires_at <= plum_dt.now(),
       )
     
     elements_to_update = qry.all()
     
     qry.update({'status':'EXPIRED'})
    

    【讨论】:

    • 你好,谢谢你的回复。我做到了,您取回了查询结果,但这与取回受更新查询影响的行并不完全相同。我的意思是可能会出现问题,或者两个查询之间可能会删除一行,或者谁知道可能会失败并且更新部分无法工作。使用此解决方案,您会认为您更新了所有内容,但情况可能并非如此。
    • 如果您觉得这可能会产生问题,您可以将您的查询包装在事务中。
    • @DeepakTripathi 当您说将查询放入事务中时,您的意思是在会话中?像with Session(engine) as session: query_1; query_2 这样如何确保对从选择查询返回的数据执行更新查询?选择查询不是先执行的吗?
    【解决方案2】:

    好的,这可能是从update 方法获取响应的一种偶然方式,但您可以通过在更新方法中使用synchronize_session='fetch' 来获取更新后的列的信息。所以原来的查询是这样的:

    session.query(my_model).filter(
        my_model.status == 'OK',
        my_model.is_validated == True,
        my_model.expires_at <= plum_dt.now(),
    ).update({'status':'EXPIRED'}, synchronize_session="fetch")
    

    更多详细信息可以在documentation 中找到。

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2020-10-30
      • 2017-12-14
      • 2018-05-13
      相关资源
      最近更新 更多