Python 回滚后发生DetachedInstanceError

Python 回滚后发生DetachedInstanceError,python,sqlalchemy,rollback,Python,Sqlalchemy,Rollback,我使用的是sqlalchemy v0.9.9(由于可能遇到一些问题,我无法进行更新)和python 2.7.13 我有一个会话,当我尝试做两次回滚时,比如 person = Person() person.forename = "Katharine" person.surname = "Hepburn" session.add(person) session.begin_nested() person.forename = "Audrey" session.rollback() session.

我使用的是sqlalchemy v0.9.9(由于可能遇到一些问题,我无法进行更新)和python 2.7.13

我有一个会话,当我尝试做两次回滚时,比如

person = Person()
person.forename = "Katharine"
person.surname = "Hepburn"
session.add(person)
session.begin_nested()
person.forename = "Audrey"
session.rollback()
session.rollback()

print person
我得到以下声明:

sqlalchemy.orm.exc.DetachedInstanceError: Instance <Personen at 0x805b83ef0> is not bound to a Session; attribute refresh operation cannot proceed
那我就没有什么例外了。因此,我必须回答以下问题:

  • 这种行为的目的是什么
  • 如何在第二次回滚之后使用person对象,而不在回滚之间添加无用的表达式,如
    person.forename
  • 谢谢你的时间


    我的全部代码:

    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    from orm_model import UpdateableViewModelBase
    from orm_model import OrmModelBase
    from sqlalchemy.schema import Column
    from sqlalchemy.types import Integer, String
    
    class Person(OrmModelBase, UpdateableViewModelBase):
        __tablename__ = 'persons'
        person_id = Column(Integer, primary_key=True)
        forename = Column(String)
        surname = Column(String)
    
        def __init__(self, person_id):
            self.person_id = person_id
            self.forename = ''
            self.surename = ''
    
    def connect():
        engine = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
        Session = sessionmaker(bind=engine)
        session = Session()
    
        return engine, session
    
    def main():
        engine, session = connect()
        person = Person(person_id=50000)
        person.forename = "Katharine"
        person.surname = "Hepburn"
        session.add(person)
        session.begin_nested()
        person.forename = "Audrey"
        session.rollback()
        person.forename
        session.rollback()
    

    这段代码只是为了确保在第二次回滚后这是behavoir的“问题”,所以我用最简单的方法编写了它。

    为什么需要两次连续回滚?无法复制。这些是准确的步骤吗?@Azat Ibrakov:在我的真实代码中,它们不是直接连续的,但我得到的是相同的
    DetachedInstanceError
    ,所以我制作了这个小伪代码,以确保它是我代码以外的其他东西的行为。问题是:在这两者之间可能有某种东西被删除(分离)。调用
    session.expunge_all()
    或类似的方法。@Ilja Everilä:我也想过,但我从来没有使用expunge_all()或类似的方法。我在问题中添加了我的全部测试代码。
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    from orm_model import UpdateableViewModelBase
    from orm_model import OrmModelBase
    from sqlalchemy.schema import Column
    from sqlalchemy.types import Integer, String
    
    class Person(OrmModelBase, UpdateableViewModelBase):
        __tablename__ = 'persons'
        person_id = Column(Integer, primary_key=True)
        forename = Column(String)
        surname = Column(String)
    
        def __init__(self, person_id):
            self.person_id = person_id
            self.forename = ''
            self.surename = ''
    
    def connect():
        engine = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
        Session = sessionmaker(bind=engine)
        session = Session()
    
        return engine, session
    
    def main():
        engine, session = connect()
        person = Person(person_id=50000)
        person.forename = "Katharine"
        person.surname = "Hepburn"
        session.add(person)
        session.begin_nested()
        person.forename = "Audrey"
        session.rollback()
        person.forename
        session.rollback()