SQLAlchemy - ObjectDeletedError: 实例 '<Class at...>' 已被删除。求助
我在从数据库中删除行然后添加新行时遇到了一些问题。以下是我的代码:
for positionid in form_result['responsibilities']:
inputdata = form_result['responsibilities'][positionid]
self.__deleterow(dbmyaccount.Responsibilities, session['authed']['userid'])
for resp in (i.strip() for i in inputdata.split(',')):
resp_q = dbmyaccount.Responsibilities(session['authed']['userid'])
resp_q.positionid = positionid
resp_q.responsibility = resp
Session.add(resp_q)
Session.commit()
def __deleterow(self, table, user):
delete_q = Session.query(table).filter_by(userid=user).first()
if delete_q:
Session.query(table).filter_by(userid=user).delete()
Session.commit()
简单来说,我是先把表里所有用户的数据清空,然后再添加他们的新选项。问题是,代码出现了这个错误:
ObjectDeletedError: Instance '<Responsibilities at ...>' has been deleted.
我完全不知道为什么... 根据我在谷歌上查到的信息,这个错误是因为我在删除了Responsibilities类的所有数据后又去修改它。我就是搞不懂怎么才能“放手”这个类,以便用新数据重新初始化它。
我到底哪里做错了?
补充说明
这是Responsibilities类的代码:
class Responsibilities(Base):
__tablename__ = 'responsibilities'
id = Column(Integer, primary_key=True)
userid = Column(Integer, ForeignKey('users.id'))
positionid = Column(Integer)
responsibility = Column(String(50))
def __init__(self, user=None):
if user:
self.userid = user
def __repr__(self):
return "<Responsibilities({0})".format(self.userid)
这是错误追踪信息:
File '<string>', line 2 in save
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\mydevenv\\lib\\site-packages\\pylons-1.0-py2.6.egg\\pylons\\decorators\\rest.py', line 33 in check_methods
return func(*args, **kwargs)
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\website\\website\\controllers\\myaccount.py', line 260 in save
self.__deleterow(dbmyaccount.Responsibilities, session['authed']['userid'])
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\website\\website\\controllers\\myaccount.py', line 210 in __deleterow
Session.query(table).filter_by(userid=user).delete()
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\mydevenv\\lib\\site-packages\\sqlalchemy-0.6.3-py2.6.egg\\sqlalchemy\\orm\\query.py', line 2031 in delete
eval_condition(obj)]
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\mydevenv\\lib\\site-packages\\sqlalchemy-0.6.3-py2.6.egg\\sqlalchemy\\orm\\evaluator.py', line 82 in evaluate
left_val = eval_left(obj)
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\mydevenv\\lib\\site-packages\\sqlalchemy-0.6.3-py2.6.egg\\sqlalchemy\\orm\\evaluator.py', line 42 in <lambda>
return lambda obj: get_corresponding_attr(obj)
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\mydevenv\\lib\\site-packages\\sqlalchemy-0.6.3-py2.6.egg\\sqlalchemy\\orm\\attributes.py', line 163 in __get__
instance_dict(instance))
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\mydevenv\\lib\\site-packages\\sqlalchemy-0.6.3-py2.6.egg\\sqlalchemy\\orm\\attributes.py', line 382 in get
value = callable_(passive=passive)
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\mydevenv\\lib\\site-packages\\sqlalchemy-0.6.3-py2.6.egg\\sqlalchemy\\orm\\state.py', line 280 in __call__
self.manager.deferred_scalar_loader(self, toload)
File 'C:\\Users\\Dave\\Documents\\Python\\pylons\\mydevenv\\lib\\site-packages\\sqlalchemy-0.6.3-py2.6.egg\\sqlalchemy\\orm\\mapper.py', line 2441 in _load_scalar_attributes
state_str(state))
ObjectDeletedError: Instance '<Responsibilities at ...>' has been deleted.
3 个回答
-1
我之前在创建测试的时候也遇到过类似的问题。我设置了“级联”关系,但问题出在创建责任的时候,user.responsibilities 也需要填上。
希望这对下一个人有帮助!
3
你尝试运行的代码是有效的,我猜问题出在你的映射器配置上,特别是你用户和职责之间的关系。你需要做的是为这个关系设置正确的 cascade
属性。你可以根据这里提供的指南,找出适合你数据库结构的正确设置:[cascade 项目]。你可以查看这个链接了解更多信息:http://www.sqlalchemy.org/docs/orm/relationships.html#the-relationship-api
13
当你进行批量删除时,它会从数据库中删除行,但不会更新SQLAlchemy会话中内存对象的引用。你可以使用synchronize_session
这个参数来让.delete()
同步会话:
Session.query(table).filter_by(userid=user).delete(synchronize_session='fetch')