2017-12-20 4 views
0

Ich möchte Zeilen abfragen und sie kopieren, während ich jeweils ein Attribut ändere. Hier ist mein Code.SQLAlchemy: KeyError beim Durchlaufen von Modellobjekten, um sie zu kopieren

In diesem Beispiel hat colObjs zwei Objekte. Ich Schleife durch colObjs, geht über jeden colObj. Der erste Artikel in der Schleife wird ordnungsgemäß kopiert. Aber wenn ich versuche, den zweiten zu kopieren, erhalte ich diesen Fehler.

Traceback (most recent call last): 
    File "/path/to/local/lib/python2.7/site-packages/flask/app.py", line 1997, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/path/to/local/lib/python2.7/site-packages/flask/app.py", line 1985, in wsgi_app 
    response = self.handle_exception(e) 
    File "/path/to/local/lib/python2.7/site-packages/flask/app.py", line 1540, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/path/to/local/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/path/to/local/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/path/to/local/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/path/to/local/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/path/to/local/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/path/to/myApp.py", line 859, in copyGraphic 
    del colObj.id 
    File "/path/to/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 227, in __delete__ 
    self.impl.delete(instance_state(instance), instance_dict(instance)) 
    File "/path/to/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 679, in delete 
    del dict_[self.key] 
KeyError: 'id' 

Weiterhin ist die Ausgabe der print Aussage über den ersten Punkt der Schleife zeigt die coloObj id, aber die zweiten Ausgänge None.

Warum tritt dieser Fehler auf? Wie repariere ich es?

Antwort

1

Der Grund, warum Sie die Ausnahme erhalten, ist, dass Sie in der Schleife festschreiben. Alles in allem ist das normalerweise ein Antipattern. Nach der ersten Runde the act of committing will expire the Column instances, die in der Sitzung zuvor waren, so in der 2. Iteration del colObj.id ausgelöst, weil das Objekt abgelaufen ist und es keinen geladenen Zustand gibt. Die Lösung besteht darin, das Commit nach der Schleife einfach zu verschieben.

Verwandte Themen