我有一个以 python 作为后端的网络应用程序。在此 Web 应用程序中,我需要连接到我的 MySQL 数据库,该数据库是使用 SQLAlchemy 建立的。问题是,每当我在服务器上启动应用程序时,第二天,当调用尝试访问数据库的函数时,我都会收到此异常: sqlalchemy.exc.OperationalError: (MySQLdb.OperationalError) (1161, '')
我像这样初始化与数据库的连接:
db_uri = f'mysql://{db_user}:{db_password}@{db_host}/{db_name}'
engine = create_engine(db_uri, pool_pre_ping=True, pool_recycle=3600)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()
我读过,其他人可以通过使用 pool_pre_ping 和 pool_recycle 来解决他们的问题,但就我而言,它不起作用。我也尝试在我的配置中设置这些参数,但它也没有任何效果:
SQLALCHEMY_ENGINE_OPTIONS = {"pool_pre_ping": True, "pool_recycle": 3600}
我还能如何确保连接持续存在或成功重新建立?
如果存在问题,使用scoped_session可以帮助解决线程安全问题。希望这可以帮助您解决连接问题!如果问题仍然存在,则可能存在特定于您的服务器或网络设置的问题需要调查。
首先,仔细检查您的 MySQL 服务器设置。有时,服务器可能由于超时设置而过快关闭连接。您可能想查看 MySQL 配置中的 wait_timeout 和 Interactive_timeout。
此外,请确保您正确关闭会话。很容易不小心将它们悬空,这可能会导致问题。使用上下文管理器来处理会话可以使事情变得更顺利:
from contextlib import contextmanager
@contextmanager
def session_scope():
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
在数据库操作中添加重试逻辑也可以帮助解决那些烦人的暂时性问题。并且不要忘记确保您的连接字符串正确并且您使用的是最新版本的 SQLAlchemy 和 MySQL 软件包。
打开 SQLAlchemy 的日志记录(create_engine 中的 echo=True)也可能为您提供有关问题所在的更多线索。
以下是对您的设置的快速更新,可能会有所帮助:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
db_uri = f'mysql://{db_user}:{db_password}@{db_host}/{db_name}'
engine = create_engine(
db_uri,
pool_pre_ping=True,
pool_recycle=3600,
echo=True # Turn off in production
)
Session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()