Python flask-sqlalchemy:我必须在查询后提交会话吗?

Python flask-sqlalchemy: Do I have to commit session after a query?

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

例如:

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

后面有一个方法:

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

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

底线是:不,您不必担心这里的 commitrollback,即使在 SQL 中,会话管理(完全独立)也已处理通过 Flask-SQLALchemy