Примечание : Это в SQLAlchemy 0.5.7. Похоже, что это невозможно, так как «ленивый» не работает при сопоставлении «один к одному». Если да, и я ошибся, пожалуйста, оставьте свой ответ.
У меня есть следующий метод, который должен возвращать все экземпляры любого класса, родитель которого равен Parent
. Обратите внимание, что класс Child
имеет атрибут с именем fubar
, который является другим классом. Я правильно сопоставил их в другом месте.
def get_all(self):
session = self.__Session()
lst = session.query(Parent).with_polymorphic('*').all()
#print lst # <-- this commented back in and it all works.
session.expunge_all()
session.close()
return lst
Затем я могу делать такие вещи, как for item in get_all(): [...]
и все такое. В отображении для child
у меня есть lazy-False
, поэтому я бы предположил, что он будет загружен нормально. Однако, если я оставлю закомментированную строку печати, я получу только это исключение:
UnboundExecutionError: Parent instance <Child at 0xa1bca4c> is not bound to a Session; lazy load operation of attribute 'fubar' cannot proceed
Вещь, которую я не понимаю, заключается в следующем: когда есть строка печати, объекты действительно загружаются нормально.
Что я делаю не так?
Редактировать: Благодаря @van, я думаю, что fubar
объекты действительно загружаются лениво. У меня есть следующее в отображении:
sqlalchemy.orm.mapper(Child, tb_child, inherits=Parent,
polymorphic_identity='Child', properties={'fubar':
sqlalchemy.orm.relation(Child,
lazy=False,
uselist=False,
cascade="all, delete-orphan")
}
)
Код для родителя:
sqlalchemy.orm.mapper(Parent,
tb_parent,
polymorphic_on=tb_parent.c.type,
polymorphic_identity='Parent')
Что с этим не так? ...
В качестве альтернативы, как я могу заставить query()
загружать все без лишних усилий?