【发布时间】:2014-06-30 23:55:54
【问题描述】:
我如何加入 3 个表,客户、订单和存款,并为数据库中存在的每个 Client.id 对 Orders.total 和 Deposits.total 执行 func.sum ?查询结果应包括列 Clients.email、func.sum(Orders.total) 和 func.sum(Deposits.total)。
到目前为止,我已经尝试了不同的查询:
listeclients = db.session.query(Clients,func.sum(Clients.orders.total).\
label("ctotal"),func.sum((Clients.deposits.total).\
label("dtotal"))).group_by(Client.id).all()
给我不同的错误,例如:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Clients.orders has an attribute 'total'
我想看看在 sqlalchemy 中是如何做到这一点的,但我也愿意接受这种查询逻辑背后的提示......
我的映射是否正确?这种连接的语法是什么?我应该在某处使用 eagerload 吗?我已经通过更简单的查询取得了成功,但是现在这样的查询已经超出了我的想象!欢迎任何帮助,即使只是原始 SQL 中的逻辑。我被这个困住了......
class Clients(db.Model):
__tablename__ = 'clients'
id = db.Column(db.Integer, primary_key = True)
email = db.Column(db.String(60), index = True, unique = True)
adresse = db.Column(db.String(64), index = True)
telephone = db.Column(db.String(10), index = True)
confirmed = db.Column(db.Boolean, default = False)
orders = db.relationship('Orders')
deposits = db.relationship('Deposits')
class Orders(db.Model):
__tablename__ = 'orders'
id = db.Column(db.Integer, primary_key = True)
client_id = db.Column(db.Integer, db.ForeignKey('clients.id'))
total = db.Column(db.Float)
date = db.Column(db.DateTime, index = True, default=datetime.now)
client = db.relationship('Clients')
class Deposits(db.Model):
__tablename__='deposits'
id = db.Column(db.Integer, primary_key = True)
date = db.Column(db.DateTime, index = True, default=datetime.now)
client_id = db.Column(db.Integer, db.ForeignKey('clients.id'))
total = db.Column(db.Float)
cheque = db.Column(db.Boolean)
client = db.relationship('Clients')
【问题讨论】:
标签: python sql sqlite sqlalchemy