SQL -альхимия, стремление к загрузке записей, на которые ссылаются множественные отношения - PullRequest
0 голосов
/ 04 марта 2020

У меня есть установка I, которая в экстремально простой форме выглядит следующим образом:

class Person(Model):
    __tablename__ = 'persons'
    id = Column(Integer, primary_key=True)
    type = relationship("PersonType", back_populates="instances")
    group = relationship("Group", back_populates="members")
    type_id = Column(Integer, ForeignKey('person_types.id'))
    group_id = Column(Integer, ForeignKey('group.id'))


class PersonType(Model):
    __tablename__ = 'person_types'
    id = Column(Integer, primary_key=True)
    instances = relationship("Person", back_populates="type")
    group = relationship("GroupType", back_populates="members")
    group_id = Column(Integer, ForeignKey('group_types.id'))


class Group(Model):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True)
    type = relationship("PersonType", back_populates="instances")
    members = relationship("Person", back_populates="group")
    type_id = Column(Integer, ForeignKey('group_types.id'))


class GroupType(Model):
    __tablename__ = 'group_types'
    id = Column(Integer, primary_key=True)
    instances = relationship("Group", back_populates="type")
    members = relationship("PersonType", back_populates="group")

Когда мой веб-интерфейс запрашивает бэкэнд, он хочет получить вложенный объект, который использует многие из отношений. Например, когда я предоставляю объект Person, я одновременно использую Person.type.group и Person.group.type, который, очевидно, является одним и тем же объектом. Для меня важно, чтобы запросы были эффективными, поэтому при загрузке данных у меня появляется следующий запрос:

Person.query.options(selectinload('type'),
               selectinload('type.group'),
               selectinload('group'), 
               defaultload('group.type'),
               raisedload('*')) 

Но когда я получаю доступ к group.type

sqlalchemy.exc.InvalidRequestError: 'Group.type' is not available due to lazy='raise'

Но, как я прочитайте документацию group.type должен быть загружен через type.group таким образом, чтобы ему не нужно было go возвращаться в базу данных и спрашивать. Итак, правильно ли я понял это и могу ли я это проверить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...