有没有办法批量加载SQLAlchemy关系中的数据?

2024-09-28 15:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,使用SQLAlchemyMany-To-Many example(有一个额外的表)

class ExternalString(Base):
    id = Column(Integer, primary_key=True)
    string = Column(String(50))

    def __repr__(self):
        return self.string


association_table = Table(
    'association', Base.metadata,
    Column('left_id', Integer, ForeignKey('left.id')),
    Column('right_id', Integer, ForeignKey('right.id'))
)


class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)

    name_id = Column(Integer, ForeignKey(ExternalString.id))
    name = relationship(ExternalString)

    children = relationship("Child", secondary=association_table)


class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)

    name_id = Column(Integer, ForeignKey(ExternalString.id))
    name = relationship(ExternalString)

如果你像下面这样做

^{pr2}$

我可以接受对Parent表的query.all()SQL调用,但每次打印出父或子名称时,都是对ExternalString表的另一个SQL调用,然后当您访问任何父行children时,会有另一个SQL调用。调试下面的输出

INFO:sqlalchemy.engine.base.Engine:SELECT `right`.id AS right_id, `right`.name_id AS right_name_id 
FROM `right`, association 
WHERE %s = association.left_id AND `right`.id = association.right_id

INFO:sqlalchemy.engine.base.Engine:SELECT external_strings.id AS external_strings_id, external_strings.string AS external_strings_string 
FROM external_strings 
WHERE external_strings.id = %s

我要问的是,在我得到所有父行之后,有没有任何方法可以指示SQLAlchemy执行批处理操作来获取父行的所有子行?在

内部操作正在执行一个相当简单的调用来获取子级,我要指示SQLAlchemy要做的是在一个SQL调用中填充所有父行子级,而不是每个父级一个调用。在

在这一点之后(我理解这对于多对多的关系来说可能有点太多了),当我们拥有所有的父对象及其子对象时,有没有任何方法填充当前卸载的所有ExternalString字段?在

在一个完美的世界里,我想为孩子们做这样的事情

session.load_all_unloaded(Child)

或者

session.load_all_unloaded(association_table)

对于琴弦

session.load_all_unloaded(ExternalString)

这将要做的是,通过会话的identity_map,获取指向Child/relationship-to-Child的所有字段和当前已卸载的ExternalString,然后执行批处理SQL调用从数据库中获取这些字段,并填充这些字段,就像在单个调用中发生的情况一样。在

总的来说,在这种情况下,如果我有3个父母,每个人有2个孩子,而不是进行13个SQL调用(1个父母调用,3个父-子调用,3个父-子名称调用,6个子名称调用),我认为它应该只进行3个调用-1个父母调用,1个孩子为所有父母和孩子调用,1个名称为所有父母和孩子。在

现在有没有办法用SQLAlchemy做到这一点?在


Tags: namerightidchildsqlbasesqlalchemy孩子