官方文档参考:https://docs.sqlalchemy.org/en/13/orm/session_basics.html#session-committing
务必注意:只要是调用了db.session的方法都必须调用以下方法,避免异常产生,
增删改查都必须调用with db.auto_commit_db()作用域执行commit和异常回滚!
def query_all_get_model_or_list(cls, result_field_list=None, order_by_field_list=None, is_throw=False,
**kwargs):
# 如果没有传status属性,默认会查询status=1【未删除的数据】
UtilGlobal.check_field_not_exist_dict_add_attr(kwargs, "status", 1)
with db.auto_commit_db():
models = db.session.query(*(result_field_list or [cls])).filter_by(**kwargs).order_by(
*(order_by_field_list or [cls.create_time.desc()])).all()
UtilGlobal.check_is_exist(models, is_throw=is_throw, err_prompt=f"数据库查询结果为models={models}")
return models
"""
功能:封装一个类让SQLAlchemy的回滚,同时兼容Python-SQLAlchemy和Flask-SQLAlchemy
"""
from contextlib import contextmanager
class OwnDBSessionRollback:
def __init__(self, db_session):
self.session = db_session
@contextmanager
def auto_commit_db(self):
"""
功能:利用contextmanager管理器,对try/except语句封装,使用的时候必须和with结合!!!
"""
try:
yield
self.session.commit()
except Exception as e:
# 加入数据库commit提交失败,必须回滚!!!
print(f"由于本次mysql请求连接失败,出现了异常,强制执行事务回滚,具体异常原因如下:{e}")
self.session.rollback()