Может ли SQLAlchemy с нетерпением/объединенные нагрузки быть подавлены после настройки?

У меня есть случай, когда большую часть времени отношения между объектами были такими, что предварительная настройка надежной (объединенной) нагрузки на отношение имела смысл. Однако теперь у меня есть ситуация, когда я действительно не хочу, чтобы с нетерпением ожидалось.

Должен ли я удалить объединенную нагрузку из отношения и изменить все соответствующие запросы для соединения в месте запроса (ick) или есть способ подавить нетерпеливый груз в запросе после его настройки?

Ниже приведен пример, в котором активная загрузка была настроена в отношении User- > Address. Можно ли сконфигурировать запрос в конце программы для НЕ загружаемой загрузки?

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
import sqlalchemy.orm as orm

##Set up SQLAlchemy for declarative use with Sqlite...
engine = sa.create_engine("sqlite://", echo = True)
DeclarativeBase = declarative_base()
Session = orm.sessionmaker(bind = engine)

class User(DeclarativeBase):
    __tablename__ = "users"
    id = sa.Column(sa.Integer, primary_key = True, autoincrement = True)
    name = sa.Column(sa.String, unique = True)
    addresses = orm.relationship("Address",
                                 lazy = "joined", #EAGER LOAD CONFIG IS HERE
                                 )
    def __init__(self, Name):
        self.name = Name

class Address(DeclarativeBase):
    __tablename__ = "addresses"
    id = sa.Column(sa.Integer, primary_key = True, autoincrement = True)
    address = sa.Column(sa.String, unique = True)
    FK_user = sa.Column(sa.Integer, sa.ForeignKey("users.id"))
    def __init__(self, Email):
        self.address = Email

##Generate data tables...
DeclarativeBase.metadata.create_all(engine)

##Add some data...
joe = User("Joe")
joe.addresses = [Address("[email protected]"),
                 Address("[email protected]")]
s1 = Session()
s1.add(joe)
s1.commit()

## Access the data for the demo...
s2 = Session()

#How to suppress the eager load (auto-join) in the query below?
joe = s2.query(User).filter_by(name = "Joe").one() # <-- HERE?
for addr in joe.addresses:
    print addr.address

Ответы

Ответ 1

Вы можете переопределить стремление свойств по запросу по запросу, насколько я помню. Будет ли это работать?

from sqlalchemy.orm import lazyload
joe = (s2.query(User)
    .options(lazyload('addresses'))
    .filter_by(name = "Joe").one())
for addr in joe.addresses:
    print addr.address

Смотрите документы.