sql alchemy:返回所有独特类型的伟大的孙子孙女

时间:2015-02-17 09:40:10

标签: sqlalchemy flask-sqlalchemy alchemy

我有6张桌子。我本质上是想回归所有独特类型的伟大的孙子孙女

如何在FreightDomesticOrder中返回所有独特类型的sku_numbers的列表?

表格定义:

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

我的另一个想法是遍历所有托盘,然后是Outer_cases等等,但这看起来太贵了。

1 个答案:

答案 0 :(得分: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()

但是,看看你的表定义,我还有一些其他的评论可能会有所帮助:

  • 您应该在表之间设置关系,以便轻松处理不同的对象。查看关于here
  • 的sqlalchemy文档
  • 我建议您阅读Database Normalization。这将有助于您了解以下几点
  • 您目前设置了Each,因此如果将相同类型的项目分配给不同的InnerCase,则会有相同类型的重复项目。这不是一个好的数据库实践。您应该将此关系设置为多对多关系,并且您可以阅读here。这样您就可以拥有一个项目列表,每个项目都可以链接到许多不同的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()