Определение того, что вложенные отношения должны активно загружаться в классах ORM?

#python #python-3.x #sqlalchemy #orm

#питон #python-3.x #sqlalchemy #орм

Вопрос:

У меня три класса

 class A(my_declarative_base):  __tablename__ = 'a'  id = Column(sqlalchemy.types.Integer)  class B(my_declarative_base):  __tablename__ = 'b'  id = Column(sqlalchemy.types.Integer)  fk_parent_a = Column(sqlalchemy.types.Integer, foreign_key(A.id))  a = relationship(A, lazy='joined')  class C(my_declarative_base):  __tablename__ = 'c'  id = Column(sqlalchemy.types.Integer)  fk_parent_b = Column(sqlalchemy.types.Integer, foreign_key(B.id))  b = relationship(B, lazy='joined')  

Моя цель-иметь возможность запускать такие запросы, как

 session = Session(engine) c_inst = session.query(C).filter_by(id=1).first() session.expunge_all() session.close()  # and then later  print(c_inst, c_inst.b, c_inst.b.a)  

В настоящее время попытка сделать это приводит DetachedInstanceError к тому, что, как я полагаю, означает, что c_inst.b.a это не извлекается, когда c_inst.b извлекается.

Варианты, которые, как я знаю, сработали бы, следующие

  1. выполните печать до закрытия сеанса
  2. session.query(C).options(joinedload(C.b).joinedload(B.a))
  3. используйте a session.merge() для подключения c_inst к новому сеансу

но, похоже, должно быть возможно принудительно A загрузить ( lazy='joined' ) с помощью исходного кода ORM таким же образом, B как и принудительно. Как бы я мог указать, что вложенные отношения также должны загружаться?

Комментарии:

1. Пример кода работает для меня без ошибок.

2. Хм, я попробовал это еще несколько раз, выдав ту же ошибку, но после этого теперь это надежно работает. Странный