sqlalchemy.exc.ArgumentError:需要列表达式、FROM 子句或列子句元素,得到 sqlalchemy.orm.attributes.InstrumentedAttribute

问题描述 投票:0回答:1

我有 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数据库。

python sqlite flask sqlalchemy flask-sqlalchemy
1个回答
0
投票

尽管安装了 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')

(在这两种情况下,您都将删除 SQLA 2.0 中不再使用的方括号。请参阅迁移指南中的此条目

© www.soinside.com 2019 - 2024. All rights reserved.