SQLAlchemy: отключить отложенную загрузку и загружать объект только при объединении () - PullRequest
0 голосов
/ 31 декабря 2018

Я работаю над отключением отложенной загрузки в SQLAlchemy, чтобы он не загружал по умолчанию все объекты при извлечении записей из базы данных.Я пытаюсь загрузить, например, пользовательский объект только из объекта события, когда вы специально присоединяете его к запросу или если вы обращаетесь к нему, например, event.user .Возможно ли это как-то с параметром или это плохая практика для отключения отложенной загрузки?

Я уже попробовал noload ("*"), но он отключает любое соединение в конце.Например, у меня есть приведенная ниже модель, а также запросы, которые я выполняю в своих тестах.

# Event model
class Event(Base):
    __tablename__ = 'events'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    amount = Column(Integer)

    _user_id = Column("user_id", Integer, ForeignKey("users.id"), nullable=False)
    user = relationship(User)

# Query - This fetches also the whole user object <-- I don't want such behavior
some_session.query(Event).all()

# Query - I would like to load the user object when I will use the join() if possible
some_session.query(Event).join(Event.user).all()

enter image description here

1 Ответ

0 голосов
/ 31 декабря 2018

По умолчанию стратегия загрузки отношений - это "отложенная загрузка", которая работает так, как вы хотите;соответствующий User загружается только в случае касания атрибута user объекта Event.В вашем случае он затрагивается вашей IDE, когда он проверяет объект, чтобы отобразить атрибуты в виде удобного дерева, и это вызывает выборку.То же самое легко происходит с пользовательскими __repr__() реализациями , если не соблюдать осторожность.

Если вы хотите загружать связанных пользователей с помощью объединения, либо используйте объединенную загрузку :

some_session.query(Event).options(joinedload(Event.user)).all()

или, если вы хотите отфильтровать на основе User в том же запросе, явное соединение (я) и contains_eager():

some_session.query(Event).join(Event.user).options(contains_eager(Event.user)).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...