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

Python 为什么sqlalchemy.orm.collections.CollectionAdapter上的for循环速度非常慢?,python,python-3.x,sqlalchemy,Python,Python 3.x,Sqlalchemy,我有以下对象定义: from sqlalchemy.orm import relationship class Project(): __tablename__ = 'projects' id = Column(Integer, primary_key=True) qws = relationship('ProjectQWS', foreign_keys='ProjectQWS.project_id',

我有以下对象定义:

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%的时间)

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

知道这是怎么回事吗

我使用PostgressSQL、Python 3.6和SQLAlchemy 1.1.18


谢谢

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

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

我认为这与您的查询加载引用的方式有关。你发布的关于ProjectQWSClass的代码是否完整,没有什么比这更重要的了?您可以将外键设置为在选择时加载或在查询时加入。目前是的,这是我在ProjectQWSClass中仅有的内容。这是我正在使用的项目查询:projects\u query=self.db\.query(Project)\.join(ProjectQWS)\.filter(ProjectQWS.qws\u id.in(Project\u qws\u id))projects=projects\u query.all()如果我在运行查询后在调试器中检查qws集合内容,我可以看到其中的内容。所以我不确定这是否是一个懒散的问题,这可能是qws关系中定义的“orderby”子句吗?我会尝试禁用它,看看它是否加快了循环。我看不出与order_by=ProjectQWS.is_main removed有什么区别。我看到lazy='joined'有轻微的改进,但没有太多。大概快10%。
qws = relationship('ProjectQWS',
                       foreign_keys='ProjectQWS.project_id',
                       cascade='all, delete-orphan',
                       lazy='joined',
                       order_by=ProjectQWS.is_main)