2010-08-14 5 views
7

Ich habe Probleme mit dem Löschen von Zeilen aus einer Datenbank und dem Hinzufügen neuer Zeilen. Hier ist der Code:SQLAlchemy - ObjectDeletedError: Instanz '<Class at...>' wurde gelöscht. Hilfe

Grundsätzlich lösche ich alle Benutzerdaten aus der Tabelle und fügen Sie dann in ihren neuen Optionen hinzu. Das Problem ist, erzeugt der Code diese Fehler:

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

Ich habe keine Ahnung, warum ... Von dem, was meine Google-Suchen gedreht haben bis der Fehler erzeugt wird, weil ich die Verantwortung Klasse bin Modifizieren schließlich gelöscht hat es sind Daten aus der Datenbank. Ich kann nicht herausfinden, wie ich die Klasse loslassen soll, um sie mit den neuen Daten neu zu initialisieren.

Was mache ich falsch?

EDIT

Hier ist die Verantwortung Klasse:

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) 

Und hier ist die Zurückverfolgungs:

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

Könnten Sie auch __init__' von 'dbmyaccount.Responsibilities' zeigen' und sagen Welche Zeile löst eine Ausnahme aus? –

+0

Aktualisieren Sie meinen ursprünglichen Beitrag mit den von Ihnen angeforderten Informationen – dave

+0

Noch kann diesen Fehler hier nicht reproduzieren, Ihr Code funktioniert gut in meinen Tests. Welche Version von SA verwenden Sie? –

Antwort

2

Der Code, den Sie ausführen möchten, ist gültig, und ich denke, die Schuld liegt in Ihrer Mapper-Konfiguration, insbesondere in Ihrer Beziehung zwischen Benutzer und Verantwortlichkeiten. Was Sie tun sollten, ist die richtige cascade Eigenschaft für diese Beziehung zu setzen, sollten Sie die richtige Einstellung für Ihre Db-Schema, um herauszufinden, der Lage sein, indem Sie die hier angegebenen Richtlinien [die Kaskade Artikel]: http://www.sqlalchemy.org/docs/orm/relationships.html#the-relationship-api

3

Wenn Sie eine Massenlöschung durchführen, löscht es die Zeilen aus den Datenbanken, aktualisiert jedoch keine Verweise auf die speicherinternen Objekte in der SQLAlchemy-Sitzung. Sie können das synchronize_session Argument .delete(), um es um die Sitzung zu synchronisieren:

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

die Warnung in der Dokumentation Siehe: http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html?highlight=query.delete#sqlalchemy.orm.query.Query.delete

Verwandte Themen