Я уверен, что где-то есть дубликат, но просто не смог его найти. Если да, отметьте этот вопрос как дубликат.
Рассмотрим очень простую модель без каких-либо отношений:
class Match(Base):
__tablename__ = 'matches'
match_date = Column(DateTime, primary_key=True)
stadium = Column(String)
opponent = Column(String)
is_date_final = Column(Boolean)
И класс DAL:
class DB:
def __init__(self, log_level):
self.engine = create_engine('sqlite:///db/db.sqlite')
self.connection = self.engine.connect()
self.Session = sessionmaker(bind=self.engine)
Base.metadata.create_all(self.engine)
Я озадачен, почему этот код работает:
def get_next_matches(self):
session = self.Session()
next_matches = session.query(Match).all()
session.close()
return next_matches
Однако следующий код вызывает DetachedInstanceError
, как только будет получено возвращаемое значение из get_next_matches
.
...
@contextmanager
def create_session_scope(session_maker):
"""Provides a transactional scope around a series of operations."""
session = session_maker()
try:
yield session
session.commit()
except SQLAlchemyError:
session.rollback()
raise
finally:
session.close()
...
def get_next_matches(self):
with create_session_scope(self.Session) as session:
next_matches = session.query(Match).all()
return next_matches