0

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

如何返回 FreightDomesticOrder 中所有唯一类型的 sku_number 的列表?

表定义:

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

我的另一个想法是遍历所有 Pallets,然后是 Outer_cases 等等,但这似乎太贵了。

4

1 回答 1

0

表定义后编辑的帖子:

鉴于您的表定义,这应该有效:

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 文档
  • 我建议阅读Database Normalization。这将帮助您理解以下几点
  • 您当前已Each设置,因此如果将它们分配给不同InnerCase的 s,则将存在相同类型的重复项。这不是一个好的数据库实践。您应该将此关系设置为多对多关系,您可以在此处阅读相关内容。这将允许您拥有一个项目列表,并且每个项目可以链接到许多不同InnerCase的 s
  • FreightDomesticOrder应该有一个订单号列。您不想使用键值作为订单号
  • 如果您还要处理国际订单,您可能应该只创建一个类型字段FreightOrderDomestic并将其重命名为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()
于 2015-02-17T22:29:09.467 回答