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

标签 python sqlalchemy

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

相关文章:

python - 在字符串中查找和格式化非正式日期的正确方法是什么?

python - 完整性错误 : ERROR: null value in column "user_id" violates not-null constraint

python - 如何使用 SQLAlchemy 将一个类映射到多个表?

python - 在多线程 sqlalchemy webapp 中推荐的 scoped_session 使用模式是什么?

python - 将 Pandas DataFrame 转换为 VALUES sql 语句

python - 模块导入时出现属性错误 - 在某些计算机上有效

python - 谷歌机器学习引擎: Prediction failed: Error during model execution

Python 导入阴影在 3.4.6 和 3.5.2 之间不同

python - 在python中将纯字符串写入文件

python - SqlAlchemy 中具有可变跟踪的 PickleType