2010-08-14 14 views
7

Tengo algunos problemas para eliminar filas de una base de datos y luego agregar nuevas. Aquí está el código:SQLAlchemy - ObjectDeletedError: Se ha eliminado la instancia '<Class at...>'. Ayuda

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() 

Básicamente, limpiar todos los datos de los usuarios de la tabla a continuación, añadir en sus nuevas opciones. El problema es que el código produce este error:

ObjectDeletedError: Instance '<Responsibilities at ...>' has been deleted. 

no tengo ni idea de por qué ... De lo que mis búsquedas de Google han aparecido, el error se produce porque estoy modificando la clase Responsabilidades después de haber eliminado todos son datos de la base de datos. No puedo encontrar la forma de 'soltar' la clase para reinicializarla con los nuevos datos.

¿Qué estoy haciendo mal?

EDITAR

Aquí está la clase Responsabilidad:

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) 

Y aquí está el rastreo:

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. 
+0

Podría también muestran '' __init__' de dbmyaccount.Responsibilities' y contar ¿Qué línea dispara la excepción? –

+0

Actualiza mi publicación original con la información que solicitaste – dave

+0

Todavía no puedo reproducir este error aquí, tu código funciona bien en mis pruebas. ¿Qué versión de SA estás usando? –

Respuesta

2

El código que está intentando ejecutar es válida y que supongo que la culpa se encuentra en la configuración de su mapeador, específicamente, su relación de Responsabilidades del usuario. Lo que debe hacer es fijar el cascade propiedad adecuada para esta relación, debe ser capaz de averiguar el ajuste correcto para su esquema de db, siguiendo las directrices dadas aquí [el cascada elemento]: http://www.sqlalchemy.org/docs/orm/relationships.html#the-relationship-api

3

Cuando realiza una eliminación masiva, elimina las filas de las bases de datos, pero no actualiza las referencias a los objetos en memoria en la sesión SQLAlchemy. Usted puede utilizar el argumento synchronize_session a .delete() conseguirlo para sincronizar la sesión:

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

Consulte la advertencia en los documentos: http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html?highlight=query.delete#sqlalchemy.orm.query.Query.delete

Cuestiones relacionadas