【问题标题】:How can I better handle this Flask-SQLAlchemy commit/rollback?我怎样才能更好地处理这个 Flask-SQLAlchemy 提交/回滚?
【发布时间】:2019-10-14 15:45:15
【问题描述】:

我正在查看我编写的一些旧代码,并且正在查看我编写的共享提交函数,用于在尝试提交对数据库的更改(例如删除)时处理对用户的响应:

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()

我想我理解我的思考过程:尝试commit,在某些失败时触发flask.abort 发送回响应,但我相信我发现数据库留下了一个需要回滚的打开会话这样做并将rollback 添加到finally 语句中解决了这个问题,让我仍然可以使用flask.abort

我对代码的疑问是:

1) 这是一个错误吗:Flask-SQLAlchemy 扩展不会正常关闭会话吗?正在调用finally 上的rollback,这将在abort 之后触发,会影响成功的commits?

2) 如果这是一个错误:在处理 try-except-finallydb 会话时我应该做些什么不同的事情?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    发生异常时需要回滚,最后关闭会话:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 2021-01-31
      • 1970-01-01
      • 2023-02-13
      • 2019-06-13
      相关资源
      最近更新 更多