问题描述
我正在使用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()
最重要的是:不,您不必担心commit
或rollback
,即使在SQL中,会话管理(完全独立)也由Flask-SQLALchemy处理>