Почему для l oop через sqlalchemy.orm.collections.CollectionAdapter чрезвычайно медленно работает SQLAlchemy 1.1.18? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть следующее определение объектов:

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,
        }


После запроса в Project для l oop over qws collectionAdapter работает очень медленно (пару сотен миллисекунд. Но это складывается, когда я запрашиваю для 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 пусто, значение для l oop быстрое.

Есть идеи, что здесь происходит?

Я использую Postgress SQL, Python 3.6 и SQLAlchemy 1.1.18

Спасибо

1 Ответ

0 голосов
/ 19 февраля 2020

Вы можете просто предварительно загрузить связанную модель. Пожалуйста, попробуйте что-то вроде этого:

qws = relationship('ProjectQWS',
                       foreign_keys='ProjectQWS.project_id',
                       cascade='all, delete-orphan',
                       lazy='joined',
                       order_by=ProjectQWS.is_main)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...