sql 炼金术:return 所有独特类型的曾曾孙

sql alchemy: return all unique types of great great grandchildren

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

如何 return FreightDomesticOrder 中 sku_numbers 的所有唯一类型的列表?

Table 定义:

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

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

在 table 定义之后编辑 post:

根据您的 table 定义,这应该有效:

SKUs = session.query(Sku.sku_number)
             .join(Each).join(InnerCase)
             .join(OuterCase).join(Pallet)
             .join(FreightOrderDomestic)
             .filter(FreightOrderDomestic.id == myOrderNumber)
             .group_by(Sku).all()

但是,在查看您的 table 定义后,我还有一些其他意见希望对您有所帮助:

  • 您应该设置 table 之间的关系,这样您就可以轻松地处理不同的对象。查看有关关系的 sqlalchemy 文档 here
  • 我建议阅读 Database Normalization。这将帮助您理解以下几点
  • 您目前有 Each 设置,因此如果将它们分配给不同的 InnerCase,将会有相同类型的重复项目。这不是一个好的数据库实践。您应该将此关系设置为多对多关系,您可以阅读 here。这将允许您拥有一个项目列表,每个项目可以 link 到许多不同的 InnerCases
  • FreightDomesticOrder 应该有一列订单号。您不想使用键值作为订单号
  • 如果您还打算处理国际订单,您可能应该只为 FreightOrderDomestic 创建一个类型字段并将其重命名为 FreightOrder

原文Post:

你能提供 table 定义吗?如果不查看您设置的关系,很难准确回答这个问题。如果您设置 tables 就像我给出的描述一样,这样的事情可能会起作用,或者因为您没有提供足够的信息而无法起作用:

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