SQLAlchemy表达式以生成汇总bom表
我正在尝试使用SQLAlchmey创建物料清单应用程序。我的数据在一个包含以下列的表中:ID、Parent、Child、QTY。我的查询在原始SQL中工作,但我的一列是一个混合属性(total_cost),因此我需要转换为SQLAlchemy以使其与该混合属性一起工作 这是我的工作原始SQL: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 (
"""
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“”