在SQLAlchemy的关系中批量加载数据的任何方法?

时间:2018-04-11 00:18:29

标签: python sqlalchemy

所以,使用SQLAlchemy' s Many-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)

如果您执行以下操作,

for p in Parent.query.all():
    print(p.name)
    for child in p.children:
        print(child.name)

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

children

在我获得所有父行之后,我有什么方法可以指示SQLAlchemy进行批处理操作以获取所有父母的孩子?

内部操作正在进行一个相当简单的调用来获取子进程,而我想指示SQLAlchemy做的是填充1个SQL调用中的所有父行子节点,而不是每个父节点1个调用。 / p>

在那之后(我知道要求多对多关系可能有点太多了),当我们有所有的父母和他们的孩子时,有没有办法填充所有{{ 1}}当前已卸载的字段?

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

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

,或者

ExternalString

和字符串,

session.load_all_unloaded(Child)

通过会话session.load_all_unloaded(association_table) ,可以做的是,获取所有指向Child / Relationship to Child的字段,以及当前卸载的ExternalString,并进行批量SQL调用以获取它们来自数据库,并填充这些字段,就像在一次调用中会发生的那样。

总的来说,在这种情况下,如果我有3个父母,每个有2个孩子,而不是进行13个SQL呼叫(1个父母呼叫,3个父子呼叫,3个父母姓名呼叫,6个孩子姓名)电话),我认为应该只打3个电话 - 1个家长打电话,1个孩子打电话给所有家长,1个姓名给所有父母和孩子。

有没有办法做到这一点,目前使用SQLAlchemy?

0 个答案:

没有答案