如何将RETURNING for query.update()与sqlalchemy一起使用

如何将RETURNING for query.update()与sqlalchemy一起使用,sqlalchemy,Sqlalchemy,我想为sqlalchemy中的特定更新指定返回值 底层的文档(sqlalchemy.sql.expression.update)表示它接受一个“returning”参数,而query.update()接受一个字典“update_args”,它将作为参数传递给查询语句 因此,我的代码如下所示: session.query( ItemClass ).update( {ItemClass.value: value_a}, synchronize_session='fetch', upd

我想为sqlalchemy中的特定更新指定返回值

底层的文档(sqlalchemy.sql.expression.update)表示它接受一个“returning”参数,而query.update()接受一个字典“update_args”,它将作为参数传递给查询语句

因此,我的代码如下所示:

session.query(
  ItemClass
).update(
  {ItemClass.value: value_a},
  synchronize_session='fetch',
  update_args={
    'returning': (ItemClass.id,)
  }
)
然而,这似乎不起作用。它只返回正则整数

我现在的问题是:我是否做错了什么,或者这在查询对象中是不可能的,我需要手动构造语句或编写原始sql?

以下是


对我有效的完整解决方案是直接使用SQLAlchemy表对象

通过执行以下操作,可以轻松地从模型中获取该表对象和列

table = Model.__table__
columns = table.columns
然后使用这个表对象,我可以复制您在问题中所做的:

from your_settings import db

update_statement = table.update().returning(table.id)\
    .where(columns.column_name=value_one)\
    .values(column_name='New column name')
result = db.session.execute(update_statement)

tuple_of_results = result.fetchall()

db.session.commit()
tuple_of_results变量将包含一个结果的tuple。 请注意,您必须运行
db.session.commit()
,才能在事务中当前运行数据库时将更改持久化

可以根据列的当前值执行更新,方法如下:

update_statement = table.update().returning(table.id)\
    .where(columns.column_name=value_one)\
    .values(like_count=table_columns.like_count+1)
这将使我们的数值
like_count
列增加1


希望这有帮助。

这是不可能的。清楚地记录了返回“由数据库的“行计数”功能返回的匹配行计数”,而不是更新查询的结果。不要相信这对他们使用
query.update()
…这里的
是什么意思?什么是
table.c
?@mymedia
table
是sqlalchemy表对象
table.c
是该表中列的集合。查看@courtsimas,如果您使用
selectables
session
query
对象,则API会有所不同,但如果后端支持返回,则所有API都支持返回。您好!我想确保其他线程不能在更新和提交之间切换。这个解决方案能做到这一点吗?
update_statement = table.update().returning(table.id)\
    .where(columns.column_name=value_one)\
    .values(like_count=table_columns.like_count+1)