使用flask框架编写网站,由于经常需要读取数据库,我就把连接数据库的代码写在一个文件中,然后在需要的py文件中调用
数据库链接文件 mysql.py
from sqlalchemy import create_engine
G_DB_HOST = "localhost"
G_DB_USER = "root"
G_DB_PWD = "123123"
G_DB_NAME = "test"
engine = create_engine(F"mysql+pymysql://{G_DB_USER}:{G_DB_PWD}@{G_DB_HOST}:3306/{G_DB_NAME}?charset=utf8&use_unicode=1")
然后在一些专门写函数的文件中就import这个文件:
from pandas as pd
from _mysql_ import *
def GetDf():
sql = "SELECT * from sh "
df = pd.read_sql_query(sql, engine)
return df
但这种文件在网站运行时经常报一个错误:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (ConnectionAbortedError(10053, '你的主机中的软件中止了一个已建立的连接。', None, 10053, None))")
[SQL: SELECT * from sh]
(Background on this error at: https://sqlalche.me/e/14/e3q8)
请问这是什么原因,该如何解决?
难道函数必须写成:
from pandas as pd
from _mysql_ import *
def GetDf():
sql = "SELECT * from sh "
# 这个engine 不能写在通用文件掉用吗???????
engine = create_engine(F"mysql+pymysql://{G_DB_USER}:{G_DB_PWD}@{G_DB_HOST}:3306/{G_DB_NAME}?charset=utf8&use_unicode=1")
df = pd.read_sql_query(sql, engine)
return df
参考:
第一、MySQL,MySQL默认的wait_timeout时间28800秒,即8小时,超过8小时,MySQL就会放弃连接。可以看一下自己的MySQL设置的时间是多少,运行show variables like '%timeout%';这个SQL即可查看到,时间根据自己业务而定,我在这里就保持8小时不变。
第二、需要修改apscheduler持久层连接时间,设置时间小于8小时,即,还没有到MySQL放弃session的时间,apscheduler就主动回收了连接,这样在使用的时候,可以解决由于超时,MySQL主动抛弃session导致的MySQL server has gone away错误。如下图所示,设置连接时间为7小时。并且pool_pre_ping为True,即每次从连接池中取连接的时候,都会验证一下与数据库是否连接正常,如果没有连接,那么该连接会被回收。
————————————————
版权声明:本文为CSDN博主「独孤清扬玩DB」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: