私は私が書いたいくつかの古いコードを見直していると私は(例えば削除など)、データベースへの変更にコミットしようとしたときに一定の障害のユーザへの応答を処理するために書かれていたコミット共有機能を見ていた: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
を試してみるが、これを実行したときにデータベースにオープンセッションが残っているrollback
にfinally
のステートメントがあるため、私はまだflask.abort
を使用できます。
私は私の周りのコードを持っている疑問は、次のとおりです。
1)これはバグです:フラスコSQLAlchemyの拡張機能は、通常のように、セッションを閉じません。 finally
のrollback
を呼び出すと、abort
が成功するためにはcommit
になった後にトリガーされますか?
2)これがバグの場合:try-except-finally
とdb
セッションを処理するには、どうすればよいですか。