所以,使用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?