【问题标题】:How to use RETURNING for query.update() with sqlalchemy如何在 sqlalchemy 中使用 RETURNING 进行 query.update()
【发布时间】:2020-09-04 18:14:56
【问题描述】:

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

基础update statement (sqlalchemy.sql.expression.update) 的文档说它接受“返回”参数,query object 的文档声明 query.update() 接受字典“update_args”将作为参数传递给查询语句。

因此我的代码如下所示:

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

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

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

【问题讨论】:

  • 不可能。 Query.update 被明确记录为返回“数据库的“行计数”功能返回的匹配行数”,而不是更新查询的结果。

标签: sqlalchemy


【解决方案1】:

这是来自SQLAlchemy documentation的sn-p:

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

【讨论】:

  • 不要相信这对他们使用 query.update() 的方式有效 ...
  • table 在这里是什么意思? table.c 是什么?
  • @mymedia table 是 sqlalchemy 表对象。 table.c 是该表中列的集合。查看docs.sqlalchemy.org/en/13/core/selectable.html
  • @courtsimas 如果您使用selectablessessionquery 对象,API 会有些不同,但如果后端支持返回我认为都支持returning。跨度>
【解决方案2】:

对我有用的完整解决方案是直接使用 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 列加一。

希望这对您有所帮助。

【讨论】:

  • 嗨!我想确保其他线程不能在更新和提交之间进行。这个解决方案能做到吗?
  • 您必须使事务(或数据库会话)可序列化。请参阅此 link 了解更多详情
  • 您可以从this video获取有关数据库隔离级别的更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 2016-04-14
  • 2016-12-17
相关资源
最近更新 更多