Sqlalchemy sql炼金术:返回所有独特类型的曾孙

Sqlalchemy sql炼金术:返回所有独特类型的曾孙,sqlalchemy,flask-sqlalchemy,alchemy,Sqlalchemy,Flask Sqlalchemy,Alchemy,我有6张桌子。我基本上是在试图归还所有独特类型的曾孙 如何返回货运订单中所有唯一类型的sku_编号列表 表定义: class FreightOrderDomestic(db.Model): """ A shipment of products from a manufacturer to a fulfillment center """ __tablename__ = 'Freight_Order_Domestic' id = db.Column(db.Integer, primary_ke

我有6张桌子。我基本上是在试图归还所有独特类型的曾孙

如何返回货运订单中所有唯一类型的sku_编号列表

表定义:

class FreightOrderDomestic(db.Model):
"""
  A shipment of products from a manufacturer to a fulfillment center
"""
__tablename__ = 'Freight_Order_Domestic'
id = db.Column(db.Integer, primary_key=True, nullable=False)


class Pallet(db.Model):
"""
  An individual Pallet (full of individual cases)
"""
__tablename__ = 'Pallet'
id = db.Column(db.Integer, primary_key=True, nullable=False)

freight_order_fkey = db.ForeignKey("Freight_Order_Domestic.id")
freight_order_id = db.Column(db.Integer, freight_order_fkey, nullable=False)



class OuterCase(db.Model):
"""
 An outer case (full of inner cases)
"""
__tablename__ = 'Outer_Case'
id = db.Column(db.Integer, primary_key=True, nullable=False)

pallet_fkey = db.ForeignKey("Pallet.id")
pallet_id = db.Column(db.Integer, pallet_fkey, nullable=False)



class InnerCase(db.Model):
"""
 An individual case (full of individual items)
"""
__tablename__ = 'Inner_Case'
id = db.Column(db.Integer, primary_key=True, nullable=False)

outer_case_fkey = db.ForeignKey("Outer_Case.id")
outer_case_id = db.Column(db.Integer, outer_case_fkey, nullable=False)



class Each(db.Model):
"""
  An individual item
"""
__tablename__ = 'Each'
id = db.Column(db.Integer, primary_key=True, nullable=False)

inner_case_fkey = db.ForeignKey("Inner_Case.id")
inner_case_id = db.Column(db.Integer, inner_case_fkey, nullable=False)

sku_fkey = db.ForeignKey("Sku.id")
sku_id = db.Column(db.Integer, sku_fkey, nullable=False)



class Sku(db.Model):
"""
  The SKU of an product, the attributes it should have to determine pricing
"""
__tablename__ = 'Sku'

id = db.Column(db.Integer, primary_key=True, nullable=False)

sku_number = db.Column(db.String(255), nullable=False)
这是我目前正在尝试的,但我被卡住了,我也在想我能做这个有多便宜:

SKUs = Session.query(Pallet, Outer_case, Inner_case, Each, Sku).filter(Pallet.id == Outer_case.pallet_id).filter(Outer_case.id == Inner_case.outer_case_id).filter(Inner_case.id == Each.inner_case_id).filter(Each.sku_id == sku.id).all()
我的另一个想法是循环使用所有托盘,然后是外包装箱等等,但这似乎太贵了。

编辑了表定义后的帖子:

class FreightOrderDomestic(db.Model):
"""
  A shipment of products from a manufacturer to a fulfillment center
"""
__tablename__ = 'Freight_Order_Domestic'
id = db.Column(db.Integer, primary_key=True, nullable=False)


class Pallet(db.Model):
"""
  An individual Pallet (full of individual cases)
"""
__tablename__ = 'Pallet'
id = db.Column(db.Integer, primary_key=True, nullable=False)

freight_order_fkey = db.ForeignKey("Freight_Order_Domestic.id")
freight_order_id = db.Column(db.Integer, freight_order_fkey, nullable=False)



class OuterCase(db.Model):
"""
 An outer case (full of inner cases)
"""
__tablename__ = 'Outer_Case'
id = db.Column(db.Integer, primary_key=True, nullable=False)

pallet_fkey = db.ForeignKey("Pallet.id")
pallet_id = db.Column(db.Integer, pallet_fkey, nullable=False)



class InnerCase(db.Model):
"""
 An individual case (full of individual items)
"""
__tablename__ = 'Inner_Case'
id = db.Column(db.Integer, primary_key=True, nullable=False)

outer_case_fkey = db.ForeignKey("Outer_Case.id")
outer_case_id = db.Column(db.Integer, outer_case_fkey, nullable=False)



class Each(db.Model):
"""
  An individual item
"""
__tablename__ = 'Each'
id = db.Column(db.Integer, primary_key=True, nullable=False)

inner_case_fkey = db.ForeignKey("Inner_Case.id")
inner_case_id = db.Column(db.Integer, inner_case_fkey, nullable=False)

sku_fkey = db.ForeignKey("Sku.id")
sku_id = db.Column(db.Integer, sku_fkey, nullable=False)



class Sku(db.Model):
"""
  The SKU of an product, the attributes it should have to determine pricing
"""
__tablename__ = 'Sku'

id = db.Column(db.Integer, primary_key=True, nullable=False)

sku_number = db.Column(db.String(255), nullable=False)
根据您的表定义,这应该可以:

SKUs = session.query(Sku.sku_number)
             .join(Each).join(InnerCase)
             .join(OuterCase).join(Pallet)
             .join(FreightOrderDomestic)
             .filter(FreightOrderDomestic.id == myOrderNumber)
             .group_by(Sku).all()
不过,看看您的表定义,我还有一些其他的意见,希望能有所帮助:

您应该设置表之间的关系,以便可以轻松地处理不同的对象。查看有关关系的sqlalchemy文档 我建议你好好读一读。这将帮助您理解以下几点 您当前拥有每个设置,因此如果将相同类型的项目分配给不同的内部案例,则会有重复的项目。这不是一个好的数据库实践。您应该将此关系设置为多对多关系,您可以阅读相关内容。这将允许您拥有一个项目列表,每个项目都可以链接到许多不同的内部案例 FreightDomesticOrder应该有一列作为订单号。您不希望将键值用作订单号 如果您还打算处理国际订单,您可能只需要为FreightOrderNational创建一个类型字段,并将其重命名为FreightOrder 原职:

你能提供表格定义吗?如果看不到您建立的关系,就很难准确回答这一问题。如果您按照我提供的说明设置表格,或者由于您没有提供足够的信息,因此无法使用,则类似的方法可能会奏效:

SKUs = session.query(Sku.sku_number)
             .join(Each).join(Inner_case)
             .join(Outer_case).join(Pallet)
             .join(Freight_order)
             .filter(Freight_order.order_number == myOrderNumber)
             .group_by(Sku).all()

更新了一个应该可以使用的查询,以及关于数据库模式总体结构的一些其他注释和资料。非常有用,谢谢。就您上面的观点而言,一个Each与InnerCases有一对多的关系,它跟踪的是一个物理产品,它只能在一个案例中