问题分析与解决方案:
我猜测是我插入数据之后,虽然执行了db.session.commit()提交事务,但是在提交事务之后却没有执行db.session.close()关闭数据库连接,导致数据一直保持连接的状态,当连接时间超过flask-sqlalchemy默认时间(10)之后,就会自动断开数据库连接,这样当我再次访问数据库时,就会报MySQL Connection not available的错误.
下面是问题描述与问题的解决过程
错误结果
访问web,有时会报MySQL Connection not available.但是刷新页面之后就能正常请求到数据了
flask-sqlalchemy报错:
OperationalError: MySQL Connection not available.
File "sqlalchemy/engine/base.py", line 1179, in _execute_context
context = constructor(dialect, self, conn, *args)
File "sqlalchemy/engine/default.py", line 688, in _init_compiled
self.cursor = self.create_cursor()
File "sqlalchemy/engine/default.py", line 1042, in create_cursor
return self._dbapi_connection.cursor()
File "sqlalchemy/pool/base.py", line 965, in cursor
return self.connection.cursor(*args, **kwargs)
File "mysql/connector/connection.py", line 809, in cursor
raise errors.OperationalError("MySQL Connection not available.")
通过sentry查看具体报错的代码,发现是插入数据时报的错误:
解决过程
看到下面这篇文章,发现提问者遇到的问题和我一模一样:
sometime is ok,sometime is wrong
再看看其它开发者的回复获得了解决问题的方向
MySQL连接在使用SQLAlchemy(MySQL)和Flask时不可用(MySQL Connection not available when use SQLAlchemy(MySQL) and Flask)
文中提到,要使用scoped_session来创建session(如果使用SQLAlchemy),
我查看了flask-sqlalchemy 封装的SQLAlchemy初始化部分的代码,flask-sqlalchemy就是使用scoped_session的方式来创建session的.