SQLAlchemy - ObjectDeletedError: Instance '' был удален.Помогите - PullRequest
9 голосов
/ 14 августа 2010

У меня проблемы с удалением строк из базы данных, а затем добавлением новых. Вот код:

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, возникает ошибка, потому что я изменяю класс Responsabilities после удаления всех его данных из базы данных. Я не могу понять, как «отпустить» класс, хотя и инициализировать его новыми данными.

Что я делаю не так?

EDIT

Вот класс Ответственность:

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.

Ответы [ 2 ]

5 голосов
/ 12 июня 2015

При массовом удалении он удаляет строки из баз данных, но не обновляет ссылки на объекты в памяти в сеансе SQLAlchemy.Вы можете использовать аргумент synchronize_session для .delete(), чтобы заставить его синхронизировать сеанс:

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 голосов
/ 15 ноября 2010

Код, который вы пытаетесь выполнить, действителен, и я полагаю, что ошибка заключается в вашей конфигурации картографа, в частности в ваших отношениях между пользователем и ответственностью. Что вы должны сделать, это установить правильное свойство cascade для этого отношения, вы должны быть в состоянии определить правильную настройку для вашей схемы БД, следуя рекомендациям, приведенным здесь [элемент * каскад ]: http://www.sqlalchemy.org/docs/orm/relationships.html#the-relationship-api

...