sqlalchemy - DetachedInstanceError при использовании сеанса в качестве контекстного менеджера с sqlite - PullRequest
0 голосов
/ 06 мая 2019

Я уверен, что где-то есть дубликат, но просто не смог его найти. Если да, отметьте этот вопрос как дубликат.

Рассмотрим очень простую модель без каких-либо отношений:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...