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)