彻底解决flask+sqlalchemy经常报500错误,日志提示(2013,‘Lost connection to MySQL server during query‘)等错误

单位内部自建及使用的微信小程序应用,后端应用采用Flask+Sqlalchemy。
系统在运行过程中查询数据频繁提示500错误,查阅后台日志中发现频繁出现错误信息sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013,‘Lost connection to MySQL server during query‘)、(2006, "MySQL server has gone away (ConnectionResetError(104,
‘Connection reset by peer’)。
经过在网上查找解决办法多次踩坑后,现记录解决方法。

一、问题现象

系统查询数据,偶尔正常查询,偶尔访问页面返回500错误提示,然后刷新一两次就又可以访问了,查看后台日志文件,发现报错。

...
    self._sock.sendall(data)
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:
...
    "MySQL server has gone away (%r)" % (e,))
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) 
(2006, "MySQL server has gone away (ConnectionResetError(104, 
'Connection reset by peer'))")
...

二、报错原因

项目配置:flask_sqlalchemy自动回收连接的秒数,默认设置的是 -1,即永远不超时

SQLALCHEMY_POOL_RECYCLE =-1

MySQL的wait_timeout默认是28800,也就是超过8小时的连接就会自动失效,而要连接的mysql通过查看发现是120秒

show variables like '%timeout%'

在这里插入图片描述

三、解决方法

在应用代码增加请求后处理, 移除每次请求的session

@app.after_request
def close_request_session(response):
    # 解决mysql server gone away
    db.session.remove()
    return response

四、实践情况

通过增加上述代码,完美解决flask与数据库相关的报错问题。

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的示例: 首先,需要安装 FlaskSQLAlchemy: ```python pip install Flask pip install SQLAlchemy ``` 然后,创建一个 Flask 应用并初始化 SQLAlchemy: ```python from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' db = SQLAlchemy(app) ``` 接下来,定义一个模型类来映射数据库中的表: ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) age = db.Column(db.Integer) ``` 然后,定义一组接口来实现 CRUD 操作: ```python # 创建用户 @app.route('/users', methods=['POST']) def create_user(): data = request.json user = User(name=data['name'], age=data['age']) db.session.add(user) db.session.commit() return jsonify({'msg': 'created', 'id': user.id}), 201 # 获取用户列表 @app.route('/users', methods=['GET']) def get_users(): users = User.query.all() return jsonify([{'id': u.id, 'name': u.name, 'age': u.age} for u in users]) # 获取指定用户 @app.route('/users/<int:user_id>', methods=['GET']) def get_user(user_id): user = User.query.get_or_404(user_id) return jsonify({'id': user.id, 'name': user.name, 'age': user.age}) # 更新用户 @app.route('/users/<int:user_id>', methods=['PUT']) def update_user(user_id): data = request.json user = User.query.get_or_404(user_id) user.name = data['name'] user.age = data['age'] db.session.commit() return jsonify({'msg': 'updated', 'id': user.id}) # 删除用户 @app.route('/users/<int:user_id>', methods=['DELETE']) def delete_user(user_id): user = User.query.get_or_404(user_id) db.session.delete(user) db.session.commit() return jsonify({'msg': 'deleted', 'id': user.id}) ``` 最后,启动应用: ```python if __name__ == '__main__': app.run(debug=True) ``` 现在,可以使用 POST、GET、PUT、DELETE 请求来创建、获取、更新和删除用户了。例如: 创建用户: ``` POST /users HTTP/1.1 Content-Type: application/json { "name": "Alice", "age": 20 } ``` 获取用户列表: ``` GET /users HTTP/1.1 ``` 获取指定用户: ``` GET /users/1 HTTP/1.1 ``` 更新用户: ``` PUT /users/1 HTTP/1.1 Content-Type: application/json { "name": "Alice", "age": 21 } ``` 删除用户: ``` DELETE /users/1 HTTP/1.1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值