egar класса sqlalchemy, загруженный с помощью selectin, недоступен после закрытия сессии - PullRequest
0 голосов
/ 25 января 2019

Я использую sqlalchemy и хочу загрузить подкласс, используя select in, но загруженный объект недоступен после закрытия сессии.

У меня есть класс CorrelationSet, в котором есть список Correlations и Broker,Код для их чтения выглядит следующим образом.

def read(self, coefficient=None):
        '''
        Read last correlation set and all associated correlations
        '''
        # Get last correlation set
        session = Session()
        query = session \
            .query(func.max(CorrelationSet.time)
                       .label("last_date"))

        lastDate = query.one().last_date

        # Get broker
        broker = BrokerDAO().read()

        # Get correlations
        query = session \
            .query(CorrelationSet) \
            .filter(CorrelationSet.brokerId == broker.ID) \
            .filter(CorrelationSet.time == lastDate)

        correlationSet = query.one()

        if coefficient is not None:
            correlationSet = correlationSet.subset(coefficient)

        session.close()

        return correlationSet

Использование JupyterNotebook Я проверил, что этот метод чтения подключает посредника к CorrelationSet с помощью этого кода:

from aitrader.dao.CorrelationSetDAO import CorrelationSetDAO
from aitrader.model.CorrelationSet import CorrelationSet

cset = CorrelationSetDAO().read(80)
broker = cset.broker
print(broker)

Вывод выглядит следующим образом, указывающий на то, что брокер загрузился.

DetachedInstanceError: Родительский экземпляр не привязан к сеансу;Операция отложенной загрузки атрибута «брокер» не может быть продолжена (Справочная информация об этой ошибке: http://sqlalche.me/e/bhk3)

Я не уверен, почему это происходит, поскольку я ожидаю, что брокер будет доступен в том виде, в каком он былзагружается с использованием selectin. Соответствующая часть класса CorrelationSet здесь:

class CorrelationSet(Base):
    __tablename__ = 'correlation_set'
    ID = Column("correlation_set_id", BigInteger, primary_key=True)
    brokerId = Column("broker_id", BigInteger, ForeignKey('broker.broker_id'))
    broker = relationship("Broker", lazy='selectin')
    correlations = relationship("Correlation", lazy='selectin')
    time = Column("correlation_date", DateTime)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...