gpt4 book ai didi

python - SQLAlchemy 中的性能一对多关系

转载 作者:太空宇宙 更新时间:2023-11-04 10:00:52 27 4
gpt4 key购买 nike

我正在尝试与 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com