【问题标题】:SQLAlchemy - ObjectDeletedError: Instance '<Class at...>' has been deleted. HelpSQLAlchemy - ObjectDeletedError:实例'<Class at ...>'已被删除。帮助
【发布时间】:2011-03-29 18:14:45
【问题描述】:

我在从数据库中删除行然后添加新行时遇到了一些问题。代码如下:

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.

我不知道为什么...从我的 Google 搜索结果来看,产生了错误,因为我在从数据库中删除了所有数据后修改了 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.

【问题讨论】:

  • 能否也显示__init__ of dbmyaccount.Responsibilities 并说明哪一行触发了异常?
  • 用您要求的信息更新我的原始帖子
  • 这里仍然无法重现此错误,您的代码在我的测试中运行良好。您使用的是哪个版本的 SA?
  • 使用版本:0.6.3。您还需要查看其他代码吗?我可以使用的任何配置选项,你不是吗?有任何想法吗? xD
  • 似乎没有其他人也有任何想法。您能否提供form_result['responsibilities'] 的转储并告诉哪个迭代产生异常?它是在第一次调用__deleterow 时发生还是仅在它插入一些值后发生?

标签: python sql orm sqlalchemy pylons


【解决方案1】:

当您进行批量删除时,它会从数据库中删除行,但不会更新对 SQLAlchemy 会话中内存中对象的引用。 您可以使用.delete()synchronize_session 参数使其同步会话:

Session.query(table).filter_by(userid=user).delete(synchronize_session='fetch')

请参阅文档中的警告:http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html?highlight=query.delete#sqlalchemy.orm.query.Query.delete

【讨论】:

    【解决方案2】:

    您尝试执行的代码是有效的,我想问题出在您的映射器配置上,特别是您的用户-职责关系。您应该做的是为此关系设置正确的cascade 属性,您应该能够按照此处给出的指南 [cascade 项] 为您的数据库模式找出正确的设置: http://www.sqlalchemy.org/docs/orm/relationships.html#the-relationship-api

    【讨论】:

      【解决方案3】:

      我在创建测试时遇到了类似的问题。我将关系配置为“级联”,但问题与创建职责有关,还需要填写 user.response。

      这是给下一个人的!

      【讨论】:

        猜你喜欢
        • 2015-09-28
        • 2023-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多