Я использую 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)