UnboundExecutionError в SQLAlchemy - PullRequest
       6

UnboundExecutionError в SQLAlchemy

3 голосов
/ 29 ноября 2011

Примечание : Это в 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() загружать все без лишних усилий?

1 Ответ

2 голосов
/ 29 ноября 2011

Из Документация по API отношений (прокрутите вниз до объяснения параметра lazy):

lazy=’select’ – specifies how the related items should be loaded. Default value is select. Values include:
    ...
    noload - no loading should occur at any time. This is to support “write-only” attributes, or attributes which are populated in some manner specific to the application.
    ...
    True - a synonym for ‘select’
    False - a synonyn for ‘joined’
    None - a synonym for ‘noload’

Таким образом, установив lazy=None, вы на самом деле не настраиваете отношения для загружаемой цели, а получаете почти противоположный результат. Вы должны использовать один из: immediate, joined or subquery вместо.

edit-1 : в свете того факта, что используется SA-0.5: я не уверен, почему отношения не загружаются с нетерпением, но вы можете попытаться явно указать его в запросе и посмотреть если это работает:

lst = (session.query(Parent).with_polymorphic('*').
    options(eagerload('fubar')).all()) # confused if it is "fubar" or "ref"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...