0

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

4

1 回答 1

0

一对多关系通常是通过在 Parent (,,one'') 类中创建一个列表属性和在 Child (,,many'') 类中创建 parent_id 反向引用来完成的(请看这里:here)。

所以你通常创建 Parent 类:

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(...)自动加载子级 - 您不必进行任何连接,除非您只想加载其子级具有特定属性值的父级。

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

于 2013-08-19T11:38:56.200 回答