簡體   English   中英

用於從另一個表中求值的SQLAlchemy子查詢

[英]SQLAlchemy Subquery for Suming values from another table

當需要返回值(即未在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'

我也嘗試將以下語句添加到子查詢()的末尾而沒有任何運氣:

.correlate(ProjectMasters.MasterProjectID, ProjectInvoices.MasterProjectID)

如果我確實包含correlate參數,那么我收到以下錯誤:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM