SQLAlchemy表达式以生成汇总bom表

SQLAlchemy表达式以生成汇总bom表,sql,sqlalchemy,flask-sqlalchemy,Sql,Sqlalchemy,Flask Sqlalchemy,我正在尝试使用SQLAlchmey创建物料清单应用程序。我的数据在一个包含以下列的表中:ID、Parent、Child、QTY。我的查询在原始SQL中工作,但我的一列是一个混合属性(total_cost),因此我需要转换为SQLAlchemy以使其与该混合属性一起工作 这是我的工作原始SQL: """ WITH RPL (parent, child, qty) AS (

我正在尝试使用SQLAlchmey创建物料清单应用程序。我的数据在一个包含以下列的表中:ID、Parent、Child、QTY。我的查询在原始SQL中工作,但我的一列是一个混合属性(total_cost),因此我需要转换为SQLAlchemy以使其与该混合属性一起工作

这是我的工作原始SQL:

            """
                WITH RPL (parent, child, qty) AS
                (
                    SELECT  ROOT.parent, ROOT.child, ROOT.qty
                    FROM BOM ROOT
                    WHERE ROOT.parent = :pn
                UNION ALL
                    SELECT PARENT.parent, CHILD.child, PARENT.qty*CHILD.qty
                    FROM RPL PARENT, BOM CHILD
                    WHERE  PARENT.child = CHILD.parent
                )
                SELECT RPL.parent, RPL.Child, SUM(RPL.qty) AS "Total QTY Used",
                    component.labor_hours*SUM(RPL.qty) AS "Total_Hours",
                    component.labor_cost*SUM(RPL.qty) AS "Total_Labor_Cost",
                    component.material_cost*SUM(RPL.qty) AS "Total_Material_Cost"
                    component.total_cost*SUM(RPL.qty) AS "Total_Purchased_Cost"
                    FROM RPL
                LEFT JOIN component on child = component.part_number
                GROUP BY parent, child
                ORDER  BY parent, child;
        """
我已经能够使用以下方法重新创建查询的前半部分(使用RPL语句):

hierarchy = (
            db.session.query(BOM, bindparam("total_qty", 1))
            .filter(BOM.parent == pn)
            .cte("cte", recursive=True)
        )

        parents = aliased(hierarchy, name="p")
        children = aliased(BOM, name="c")
        comps = aliased(Component, name='a')

        hierarchy = hierarchy.union_all(
            db.session.query(children, (parents.c.qty * children.qty).label("total_qty")).filter(
                parents.c.child == children.parent
            )
        )
类别声明:

class Component(db.Model):
"""
Component entry in components table
"""

part_number = db.Column(db.Text(), primary_key=True)
description = db.Column(db.Text(), nullable=True)
customer = db.Column(db.Text(), nullable=True)
labor_hours = db.Column(db.Float(), nullable=True)
labor_cost = db.Column(db.Float(), nullable=True)
material_cost = db.Column(db.Float(), nullable=True)

@hybrid_property
def total_cost(self):
    return self.labor_cost + self.material_cost

def __repr__(self):
    return f"<Part_Number:- {self.part_number} - {self.description}>"

class BOM(db.Model):
"""
    BOM entry in bom table
"""

id = db.Column(db.Integer, primary_key=True, autoincrement=True)
parent = db.Column(
    db.Text(), db.ForeignKey(Component.part_number, name="parent_part")
)
child = db.Column(
    db.Text(), db.ForeignKey(Component.part_number, name="child_part")
)
qty = db.Column(db.Float())

UniqueConstraint(parent, child, name="pair_unique")

def __repr__(self):
    return f"<BOM Pair:- {self.parent} - {self.child} - {self.qty}>"
类组件(db.Model):
"""
组件表中的组件条目
"""
part_number=db.Column(db.Text(),主键=True)
description=db.Column(db.Text(),null=True)
customer=db.Column(db.Text(),null=True)
工时=db.Column(db.Float(),nullable=True)
人工成本=db.Column(db.Float(),nullable=True)
物料成本=db.Column(db.Float(),null=True)
@杂化性
def总成本(自身):
返回自人工成本+自材料成本
定义报告(自我):
返回f“”
类别物料清单(数据库模型):
"""
BOM表中的BOM条目
"""
id=db.Column(db.Integer,主键=True,自动递增=True)
parent=db.Column(
db.Text(),db.ForeignKey(Component.part\u number,name=“parent\u part”)
)
child=db.Column(
db.Text(),db.ForeignKey(Component.part\u number,name=“child\u part”)
)
qty=db.Column(db.Float())
唯一约束(父项、子项、name=“pair\u unique”)
定义报告(自我):
返回f“”