2017-12-20 6 views
0

행을 쿼리하고 각각의 특성을 변경하면서 복사하려고합니다. 여기 내 코드가있다.SQLAlchemy : 모델 개체를 복사하여 반복 할 때 KeyError

colObjs= db.session.query(Column).filter_by(chart_id=oldChartID).all() 
for colObj in colObjs: 
    make_transient(colObj) 
    print colObj.id 
    del colObj.id 
    colObj.chart_id= newChartID 
    db.session.add(colObj) 
    db.session.commit() 

이 예제에서 colObjs에는 두 개의 개체가 있습니다. 나는 각각 colObj을 거쳐 colObjs을 반복합니다. 루프의 첫 번째 항목이 잘 복사됩니다. 하지만 두 번째 복사본을 복사하려고하면이 오류가 발생합니다.

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' 

또한, 루프의 첫 번째 항목에 print 명령문의 출력 coloObj ID를 도시하지만, 두 번째는 None 출력한다.

왜이 오류가 발생합니까? 어떻게 수정해야합니까?

답변

1

예외가 발생하는 이유는 루프에서 커밋하는 것입니다. 대체로 반 패턴입니다. 이전 세션에 있던 첫 번째 라운드 the act of committing will expire the Column instances 이후에 두 번째 반복에서 del colObj.id이 발생합니다. 개체가 만료되었고로드 된 상태가 없기 때문입니다. 해결 방법은 루프 이후 커밋을 단순히 이동하는 것입니다.