所以,使用SQLAlchemy
的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)
如果你像下面这样做
^{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做到这一点?在
目前没有回答
相关问题 更多 >
编程相关推荐