【发布时间】:2017-12-26 19:55:29
【问题描述】:
假设我有一个包含宽度和长度列的 ROOMS 表,以及一个相应的 SQLAlchemy 模型。有没有一种干净有效的方法来获得所有房间的总面积,即总和(长 x 宽)?通过在客户端循环很容易做到这一点,但如果可以通过服务器上的查询获取它肯定会更有效。
编辑:
我认为我可以通过将问题简化为一个简单、干净的示例来提供帮助,但我现在意识到我只是在踢自己的脚,因为我的困难显然源于对 SQLAlchemy 和使用 ORM 的更根本的理解不足。
我的模型(flask-sqlalchemy)实际上涉及三个相关的表:holdings、commercial 和 prices。商品有多种价格,每份持有量都是给定商品的数量。我的设置如下:
class Holding(db.Model):
id = db.Column(db.Integer, primary_key=True)
time = db.Column(db.TIMESTAMP, index=True)
quantity = db.Column(db.DECIMAL(10,5))
commodity_id = db.Column(db.Integer, db.ForeignKey('commodity.id'))
commodity = db.relationship('Commodity', back_populates='holdings')
class Commodity(db.Model):
id = db.Column(db.Integer, primary_key=True)
symbol = db.Column(db.String(20))
name = db.Column(db.String(150))
holdings = db.relationship('Holding', back_populates='commodity', lazy='dynamic')
prices = db.relationship('Price', back_populates='commodity', lazy='dynamic', order_by='Price.time.desc()')
class Price(db.Model):
id = db.Column(db.Integer, primary_key=True)
time = db.Column(db.TIMESTAMP, index=True)
amount = db.Column(db.DECIMAL(10,5), index=True)
commodity_id = db.Column(db.Integer, db.ForeignKey('commodity.id'))
commodity = db.relationship('Commodity', back_populates='prices')
我想要 Holding.quantity * Holding.commodity.[最新价格] 的总和。
由于 Commodity.prices 是按时间降序排列的,我可以很容易地计算出持有循环检查中的值:
h.commodity.prices.first().amount * h.quantity
...但是我看不到如何从单个查询中获取相关的价格详细信息,所以我不知道如何应用@leovp 的解决方案。
我希望现在正确描述问题,为错误的开始道歉。
【问题讨论】:
-
假设,假设......那么你有没有模特?!是的,这是可能的。只需选择产品的总和即可。
-
不,我没有那个特定的模型 - ROOMS 示例是一个简化,我认为它很好地描述了问题。显然我不知道如何选择产品的总和。
-
@Ilja Everilä 我可以在原始 SQL 中执行此操作,但我想知道如何使用 SQLAlchemy ORM 方式执行此操作。希望我更新的描述能澄清。
-
你用的是什么数据库?
-
MySQL(5.7 版)。
标签: python orm sqlalchemy greatest-n-per-group