我想在sqlalchemy中指定特定更新的返回值.
底层更新语句(sqlalchemy.sql.expression.update)的文档说它接受一个"返回"参数,查询对象的文档说明query.update()接受一个字典"update_args",它将作为查询语句的参数.
因此我的代码如下所示:
session.query(
ItemClass
).update(
{ItemClass.value: value_a},
synchronize_session='fetch',
update_args={
'returning': (ItemClass.id,)
}
)
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不起作用.它只返回常规整数.
我现在的问题是:我做错了什么,或者这对查询对象根本不可能,我需要手动构造语句或编写原始sql?
对我有用的完整解决方案是直接使用 SQLAlchemy 表对象。
您可以通过执行以下操作轻松地从模型中获取该表对象和列
table = Model.__table__
columns = table.columns
Run Code Online (Sandbox Code Playgroud)
然后使用这个表对象,我可以复制您在问题中所做的事情:
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()
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这将使我们的数字like_count列加一。
希望这有帮助。
以下是SQLAlchemy 文档的片段:
# UPDATE..RETURNING
result = table.update().returning(table.c.col1, table.c.col2).\
where(table.c.name=='foo').values(name='bar')
print result.fetchall()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2938 次 |
| 最近记录: |