2017-09-13 7 views
0

私は私が書いたいくつかの古いコードを見直していると私は(例えば削除など)、データベースへの変更にコミットしようとしたときに一定の障害のユーザへの応答を処理するために書かれていたコミット共有機能を見ていた:Flask-SQLAlchemyのコミット/ロールバックをよりうまく処理できますか?

def _commit_to_database(): 
    """A shared function to make a commit to the database and handle exceptions 
    if encountered. 
    """ 
    flask.current_app.logger.info('Committing changes to database...') 
    try: 
     db.session.commit() 
    except AssertionError as err: 
     flask.abort(409, err) 
    except (exc.IntegrityError, sqlite3.IntegrityError) as err: 
     flask.abort(409, err.orig) 
    except Exception as err: 
     flask.abort(500, err) 
    finally: 
     db.session.rollback() 

私は思考プロセスを理解していると思う:特定の失敗時にflask.abortが応答を返すようにトリガーすると、commitを試してみるが、これを実行したときにデータベースにオープンセッションが残っているrollbackfinallyのステートメントがあるため、私はまだflask.abortを使用できます。

私は私の周りのコードを持っている疑問は、次のとおりです。

1)これはバグです:フラスコSQLAlchemyの拡張機能は、通常のように、セッションを閉じません。 finallyrollbackを呼び出すと、abortが成功するためにはcommitになった後にトリガーされますか?

2)これがバグの場合:try-except-finallydbセッションを処理するには、どうすればよいですか。

答えて

0

あなたは例外が発生した場合にロールバックし、最終的にセッションを終了する必要があります。

def _commit_to_database(): 
    """A shared function to make a 
     commit to the database and 
     handle exceptions if encountered. 
    """ 
    flask.current_app.logger.info(
     'Committing changes to db...' 
    ) 
    try: 
     db.session.commit() 
    except AssertionError as err: 
     db.session.rollback() 
     flask.abort(409, err) 
    except (
     exc.IntegrityError, 
     sqlite3.IntegrityError 
    ) as err: 
     db.session.rollback() 
     flask.abort(409, err.orig) 
    except Exception as err: 
     db.session.rollback() 
     flask.abort(500, err) 
    finally: 
     db.session.close() 
関連する問題