如何对sqlalchemy使用RETURNING for query.update()

时间:2017-08-23 14:35:43

标签: sqlalchemy

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

底层update statement(sqlalchemy.sql.expression.update)的文档说它接受一个“返回”参数和query object状态的文档,查询.update()接受一个字典“update_args”将作为参数传递给查询语句。

因此我的代码如下所示:

session.query(
  ItemClass
).update(
  {ItemClass.value: value_a},
  synchronize_session='fetch',
  update_args={
    'returning': (ItemClass.id,)
  }
)

但是,这似乎不起作用。它只返回常规整数。

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

2 个答案:

答案 0 :(得分:0)

以下是SQLAlchemy documentation

的摘录
# UPDATE..RETURNING
result = table.update().returning(table.c.col1, table.c.col2).\
    where(table.c.name=='foo').values(name='bar')
print result.fetchall()

答案 1 :(得分:0)

对我有用的完整解决方案是直接使用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变量将包含结果的元组。 请注意,您必须运行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的列增加一。

希望这很有帮助。