如果没有数据库连接,如何配置Flask/SQLAlchemy来创建新的数据库连接?
我有一个很少访问的Python/Flask服务器,它使用SQLAlchemy.它每隔几天就会被访问一次,在第一次访问时,它通常会抛出一个"MySQL服务器已经消失"错误.后续的页面浏览量很好,但出现这个初始错误看起来不专业.
我想知道正确的方法来处理这个问题——像"让一段很长的时间离开"这样的建议,在这种情况下大约需要4天,似乎并不正确.如何测试数据库连接的缺失,并在需要时创建数据库连接?
如果没有数据库连接,如何配置Flask/SQLAlchemy来创建新的数据库连接?
我有一个很少访问的Python/Flask服务器,它使用SQLAlchemy.它每隔几天就会被访问一次,在第一次访问时,它通常会抛出一个"MySQL服务器已经消失"错误.后续的页面浏览量很好,但出现这个初始错误看起来不专业.
我想知道正确的方法来处理这个问题——像"让一段很长的时间离开"这样的建议,在这种情况下大约需要4天,似乎并不正确.如何测试数据库连接的缺失,并在需要时创建数据库连接?
我以前在这方面遇到过麻烦,发现解决这个问题的方法是不保留会话.问题是你试图让一个连接保持太长时间.相反,可以在__init__.py
中或在任何地方导入的实用程序包中使用线程本地作用域会话:
from sqlalchemy.orm import scoped_session, sessionmaker
Session = scoped_session( sessionmaker() )
然后设置引擎和元数据一次.这允许您在每次连接/断开时跳过配置机制.之后,你可以像这样做你的数据库工作:
session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()
如果希望保留旧对象,但又不想让会话保持打开状态,则可以使用上述模式并像这样重用旧对象:
session = Session()
someObject = session.merge( someObject )
# more db stuff
session.close()
关键是,你想打开你的会话,完成你的工作,然后关闭会话.这很好地避免了超时.有很多 Select .合并并删除.添加允许您包含对分离对象所做的更改或从数据库加载新数据的选项.这些文档非常冗长,但一旦你知道你在寻找什么,可能会更容易找到.
要真正做到这一点并防止MySQL"消失",您需要解决连接池保持连接打开时间过长以及为您判断旧连接的问题.
要获得新的连接,您可以在create_engine
通话中设置pool_recycle
选项.将这pool_recycle
设置为两次签出之间连接池中希望创建新连接而不是返回现有连接的秒数.