gpt4 book ai didi

python - SQLAlchemy 子查询,用于从另一个表中求和值

转载 作者:太空宇宙 更新时间:2023-11-03 14:32:50 24 4
gpt4 key购买 nike

当需要返回值(即不在 WHERE 中使用)时,我正在努力理解在 SQLAlchemy 中执行子查询的正确语法。

我正在使用声明式方法。

有两种模型被使用:

class ProjectInvoices(Base):
InvoiceID = Column(Integer(unsigned=True), default=0, primary_key=True, autoincrement=True)
MasterProjectID = Column(Integer(unsigned=True), index=True, nullable=False)
ExpenseAmount = Column(Numeric(10, 2), default=0)
HoursAmount = Column(Numeric(10, 2), default=0)
IsVoid = Column(Boolean, default=0, index=True)
IsSubmit = Column(Boolean, default=0, index=True)

class ProjectMasters(Base):
MasterProjectID = Column(Integer(unsigned=True), default=0, primary_key=True, autoincrement=True)
MasterProjectName = Column(Unicode(255))
MasterProjectMemo = Column(UnicodeText)
IsActive = Column(Boolean, default=0, index=True)

查询的重点是通过使用子查询对相关发票求和来确定每个项目的当前发票金额。这是在子查询中完成的,而不仅仅是连接,还有其他原因,所以我真的需要弄清楚子查询问题。

这是我当前 SA 查询的示例:

sqry = session.query(
func.sum(
func.ifnull(ProjectInvoices.ExpenseAmount, 0)
+ func.ifnull(ProjectInvoices.HoursAmount, 0))).label('billed_total')
).filter(and_(ProjectInvoices.IsVoid == 0, ProjectInvoices.IsSubmit == 1)
).subquery()

result = session.query(
ProjectMasters.MasterProjectID,
ProjectMasters.MasterProjectName,
sqry.columns.billed_total.label('invoice_total')
).filter(ProjectMasters.IsActive == 1).all()

我觉得这会很简单,但我似乎无法破解让它工作的代码。

我已经尝试了几乎所有我能找到的样本,但结果好坏参半。如果我省略 .correlate() 参数,我会收到以下错误:

'Alias' object has no attribute 'MasterProjectID'

我也曾尝试将以下语句添加到 subquery() 的末尾,但没有成功:

.correlate(ProjectMasters.MasterProjectID, ProjectInvoices.MasterProjectID)

如果我确实包含相关参数,则会收到以下错误:

TypeError: Boolean value of this clause is not defined

提前感谢您的帮助...

最佳答案

通常我会使用column_property来处理这样的需求,例如

class ProjectMasters(Base):
...

billed_total = column_property(
select(
[func.sum(
func.coalesce(ProjectInvoices.ExpenseAmount, 0)
+ func.coalesce(ProjectInvoices.HoursAmount, 0)
)],
and_(
MasterProjectID == ProjectInvoices.MasterProjectID,
ProjectInvoices.IsVoid == False,
ProjectInvoices.IsSubmit == True,
),
).label('billed_total'),
deferred=True,
)

之后,您可以像普通属性一样使用它,例如

result = session.query(
ProjectMasters.MasterProjectID,
ProjectMasters.MasterProjectName,
ProjectMasters.billed_total.label('invoice_total'),
).filter(ProjectMasters.IsActive == 1).all()

关于python - SQLAlchemy 子查询,用于从另一个表中求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788288/

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