【问题标题】:Selectively performing mathematical calculation on InstrumentedAttribute in Flask/SQLAlchemy在 Flask/SQLAlchemy 中选择性地对 InstrumentedAttribute 执行数学计算
【发布时间】:2021-09-28 03:39:11
【问题描述】:

我正在使用 Flask / SQLAlchemy ORM,我想做的是有选择地对 sqlalchemy.orm.attributes.InstrumentedAttribute 的实例执行数学计算。像这样的等式类似于User.query.update({User.score: User.points / User.time})

例如,假设我的 PostgreSQL 数据库中有 > 100,000 个条目,如下所示:User.points --> [12, 3, 0, ..., 45]; User.time --> [102, 23, 45, ..., 12](请注意User.points 中的0)。在下面的示例中,我会收到一个异常,指出我不能取 0 的对数。

from sqlalchemy import func
from project.models import User


User.query.update({User.score: func.log(User.points / User.time)})

我想有选择地选择要在哪个InstrumentAttribute 上执行计算。我可以使用User.query.filter 过滤查询,但是如果您愿意,我如何将其转换为过滤模型而不进行迭代计算?

【问题讨论】:

  • 为什么不能使用 .where(User.points > 0) 之类的东西?
  • 嗯,我认为这行不通,除非我有不同的解释:User.query.update({User.score: func.log(User.points / User.time)}).where(User.points != 0)

标签: python python-3.x flask sqlalchemy


【解决方案1】:
db.session.query(User).where(User.points != 0).update({User.score: func.log(User.points / User.time)})
// or
User.query.filter(User.points != 0).update({User.score: func.log(User.points / User.time)})
db.session.commit()

日志:

2021-07-20 20:20:25,750 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2021-07-20 20:20:25,754 INFO sqlalchemy.engine.Engine UPDATE "user" SET score=log("user".points / "user".time) WHERE "user".points != %(points_1)s
2021-07-20 20:20:25,754 INFO sqlalchemy.engine.Engine [no key 0.00046s] {'points_1': 0}
2021-07-20 20:20:25,764 INFO sqlalchemy.engine.Engine UPDATE "user" SET score=log("user".points / "user".time) WHERE "user".points != %(points_1)s
2021-07-20 20:20:25,764 INFO sqlalchemy.engine.Engine [no key 0.00055s] {'points_1': 0}
2021-07-20 20:20:25,766 INFO sqlalchemy.engine.Engine COMMIT

【讨论】:

  • 哇,没想到这么简单。非常感谢
  • 作为更新,如果您担心数学输出(在我的例子中是商)会造成麻烦,您可以写:User.query.filter((User.points / User.time) > 0).update({User.score: func.log(User.points / User.time)})
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多