Python flask-sqlalchemy:查询后是否必须提交会话?

问题描述

我正在使用MysqL DB(https://flask-sqlalchemy.palletsprojects.com/en/2.x/)在python flask-sqlalchemy中编写一个应用程序,我想知道之后是否必须制作“ db.session.commit()或db.session.rollback()” GET调用,仅查询数据库

例如:

@app.route('/getorders')
def getorders():
    orders = Order.query.all()
    # Do I have to put here "db.session.commit()" or "db.session.rollback" ?
    return { 'orders': [order.serialize() for order in orders] }

解决方法

orders = Order.query.all()是一个SELECT查询,可以扩展为包括其他过滤器(WHERE等)。它不会更改数据库,只是从中读取值。正是由于这个原因,您不需要commit进行读取-除了“我只是读取此数据”之外,您还可以存储什么?数据库以其他方式(例如访问权限和日志)来关注此问题。

鉴于上述情况,rollback毫无意义,因为实际上没有任何更改可以回滚。

Flask-SQLAlchemy在会话之间进行了一些魔术操作。大致相当于:

from sqlalchemy.orm import scoped_session,sessionmaker

Session = sessionmaker(bind=engine,autocommit=False,autoflush=False)
db_session = scoped_session(Session)

接着是close sessions的方法:

def init_db(app):
    app.teardown_appcontext(teardown_session)

def teardown_session(exception=None):
    db_session.remove()

最重要的是:不,您不必担心commitrollback,即使在SQL中,会话管理(完全独立)也由Flask-SQLALchemy处理>