我有 2 个烧瓶模型。简化如下:
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
weight = db.Column(db.Integer, default=0)
class Package(db.Model):
id = db.Column(db.Integer, primary_key=True)
quantity = db.Column(db.Integer, default=0)
product_id = db.Column(db.Integer, db.ForeignKey('product.id'))
product = db.relationship('Product')
@hybrid_property
def total_weight(self):
return self.quantity * (self.product.weight if self.product else 0)
@total_weight.expression
def total_weight(cls):
weight_column = select([Product.weight]).where(Product.id == cls.product_id).label('product_weight')
return case([(cls.product_id.isnot(None), cast(cls.quantity * weight_column, Integer)),], else_=0).label('total_weight')
我正在尝试使用以下查询找到所有包裹的总重量总和:
db.session.query(func.sum(Package.total_weight)).scalar()
我也尝试过:
db.session.query(func.sum(Package.total_weight.expression())).scalar()
但是在这两种情况下,我都会收到以下错误:
sqlalchemy.exc.ArgumentError: Column expression, FROM clause, or other columns clause element expected, got [<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x1103e0220>]. Did you mean to say select(<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x1103e0220>)?
我正在寻找正确的 sql express 或 Hybrid_property 表达式的替代方案。
如果有帮助的话,我当前的数据库是sqlite3数据库。
尽管安装了 SQLAlchemy 2.0,但您似乎仍在使用旧语法。
改变
select([Product.weight])
到
select(Product.weight)
和
case([(cls.product_id.isnot(None), cast(cls.quantity * weight_column, Integer)),], else_=0).label('total_weight')
到
case((cls.product_id.isnot(None), cast(cls.quantity * weight_column, Integer)), else_=0).label('total_weight')