SQLAlchemy通过子查询检索一对多实体

时间:2013-08-19 07:54:22

标签: python sql join sqlalchemy one-to-many

如何指示SQLAlchemy加载一对多关系?我可以加入它们,但这会导致重复和(取决于结果的大小)很多开销。理想情况下,我想以某种方式修改session.query,以便发送多个(两个)查询来检索父项及其所有子实体。如何通过配置SQLA或扩展会话类来实现这一点?或者这可能不是SQLA中常用的做法...

1 个答案:

答案 0 :(得分:0)

一对多关系通常通过在Parent(,, one'')类中创建list属性并在Child(,, many'')类中创建parent_id反向引用来完成(请查看此处:here )。

所以你通常创建父类:

class Parent(Base):
  __tablename__ = "parents"
  dbid = Column(Integer, Sequence("parent_seq"), primary_key=True)
  children = relationship("Child", order_by = "Children.dbid", backref = "_parent")

  def __init__(self, children = [])
    self.children = children  #remember to initialize children as list!

和儿童班:

class Child(Base):
  __tablename__ = "children"
  dbid = Column(Integer, Sequence("child_seq"), primary_key=True)
  parent_dbid = Column(Integer, ForeignKey("parents.dbid"))

如果你想将孩子添加到父母,那就这样做:

p = Parent()
c = Child()
p.children.append(c)

session.add(p)
session.add(c)
session.commit()

然后,如果您要加载包含其所有子级的父级,则只需加载父级session.query(...)并且子级自动加载 - 您不必进行任何联接,除非您需要例如,仅加载其子项具有特定属性值的父项。

希望有所帮助。如果有任何不清楚的地方,请写评论 - 我会尝试编辑我的答案以指定。