我正在尝试与 SqlAlchemy 定义一对多关系,其中我有 Parent 有很多 Child
class Parent(Base):
__tablename__ = "parent"
id = Column(String, primary_key = True)
children = relationship("Child")
class Child(Base):
__tablename__ = "child"
id = Column(Integer, primary_key = True)
feed_type_id = Column(String, ForeignKey("parent.id"))
从业务规则来看,Parent 没有多少 Child(在 10 到 30 之间),大多数时候我需要访问所有这些,所以我认为 relationship() 检索内存中的所有 child 是个好主意,以便提高性能(第一个问题:我说得对吗?)但我很少需要得到一个特定的 child ,但我不会做类似的事情:
def search_bar_attr(some_value)
for bar in foo.bars:
if(bar.attr == some_value)
return bar
lazy="dynamic"返回一个允许查询的列表,但我认为它对“急切”加载很慢,因为动态关系总是查询数据库。
第二个问题:是否有一些配置可以满足我的所有需求?
最佳答案
您可以使用 .with_parent
构造与 lazy="dynamic"
相同的查询.
class Parent(Base):
...
@property
def children_dynamic(self):
return object_session(self).query(Child).with_parent(self, Parent.children)
如果您必须编写很多这样的代码,您甚至可以添加一个函数来减少样板代码:
def dynamicize(rel):
@property
def _getter(self):
return object_session(self).query(rel.parent).with_parent(self, rel)
return _getter
class Parent(Base):
...
children = relationship("Child")
children_dynamic = dynamicize(children)
关于python - SQLAlchemy 中的性能一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43665422/