#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
извлекается.
Варианты, которые, как я знаю, сработали бы, следующие
- выполните печать до закрытия сеанса
session.query(C).options(joinedload(C.b).joinedload(B.a))
- используйте a
session.merge()
для подключенияc_inst
к новому сеансу
но, похоже, должно быть возможно принудительно A
загрузить ( lazy='joined'
) с помощью исходного кода ORM таким же образом, B
как и принудительно. Как бы я мог указать, что вложенные отношения также должны загружаться?
Комментарии:
1. Пример кода работает для меня без ошибок.
2. Хм, я попробовал это еще несколько раз, выдав ту же ошибку, но после этого теперь это надежно работает. Странный