Python 回滚后发生DetachedInstanceError
我使用的是sqlalchemy v0.9.9(由于可能遇到一些问题,我无法进行更新)和python 2.7.13 我有一个会话,当我尝试做两次回滚时,比如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.
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.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()