2017-12-20 3 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には2つのオブジェクトがあります。私はcolObjsをループし、それぞれcolObjに行きます。ループの最初の項目は正常にコピーされます。しかし、私が2番目のものをコピーしようとすると、私はこのエラーを受け取ります。

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

例外が発生する理由は、ループでコミットするためです。すべては、通常、反パターンです。第1ラウンドthe act of committing will expire the Column instancesが以前のセッションにあった後は、オブジェクトが期限切れでロードされた状態がないため、第2回の反復でdel colObj.idが発生します。解決策は、ループの後で単純にコミットを移動することです。

関連する問題