gpt4 book ai didi

python - 如何连接 3 个表并执行 func.sum

转载 作者:太空宇宙 更新时间:2023-11-03 18:19:23 25 4
gpt4 key购买 nike

如何连接 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')

最佳答案

更新:更新了下面的查询以正确处理sum:

sq1 = (db.session.query(Orders.client_id, func.sum(Orders.total).label("ctotal"))
.group_by(Orders.client_id)).subquery("sub1")

sq2 = (db.session.query(Deposits.client_id, func.sum(Deposits.total).label("dtotal"))
.group_by(Deposits.client_id)).subquery("sub2")

q = (db.session.query(Clients, sq1.c.ctotal, sq2.c.dtotal)
.outerjoin(sq1, sq1.c.client_id == Clients.id)
.outerjoin(sq2, sq2.c.client_id == Clients.id)
)
<小时/>

此外,您可以简单地使用 backref,而不是定义两次关系(这实际上可能在某些版本的 sqlalchemy 上失败):

class Clients(db.Model):
orders = db.relationship('Orders', backref='client')
deposits = db.relationship('Deposits', backref='client')

class Orders(db.Model):
# client = db.relationship('Clients')

class Deposits(db.Model):
# client = db.relationship('Clients')

关于python - 如何连接 3 个表并执行 func.sum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24421993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com