为什么sqlalchemy.orm.collections.CollectionAdapter上的for循环速度非常慢?

2024-09-29 01:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下对象定义:

from sqlalchemy.orm import relationship

class Project():
    __tablename__ = 'projects'

    id = Column(Integer, primary_key=True)
    qws = relationship('ProjectQWS',
                       foreign_keys='ProjectQWS.project_id',
                       cascade='all, delete-orphan',
                       order_by=ProjectQWS.is_main)

class ProjectQWS():

    __tablename__ = 'projects_qws'

    project_id = Column(
        Integer,
        ForeignKey('projects.id', name='fk_qws_project_id', ondelete='CASCADE'),
        primary_key=True,
    )
    qws_id = Column(String(QWS_ID_SIZE), nullable=False, primary_key=True)

    def to_dict(self):
        return {
            'project_id': self.project_id,
            'qws_id': self.qws_id,
        }


在查询项目之后,qws collectionAdapter上的for循环速度非常慢(几百毫秒。但是当我查询1000多个项目时,这加起来),即使qws集合主要包含1个元素(99%的时间)

def get_qws_dicts(self):
        result = []
        if self.qws:
            for qws_instance in self.qws:
                result.append(qws_instance.to_dict())
        return result

当qws为空时,for循环速度很快

知道这是怎么回事吗

我使用PostgressSQL、Python 3.6和SQLAlchemy 1.1.18

谢谢


Tags: keyselfprojectidtrueforcolumnresult
1条回答
网友
1楼 · 发布于 2024-09-29 01:24:43

您可以只预加载相关模型。 请尝试以下方式:

qws = relationship('ProjectQWS',
                       foreign_keys='ProjectQWS.project_id',
                       cascade='all, delete-orphan',
                       lazy='joined',
                       order_by=ProjectQWS.is_main)

相关问题 更多 >