如果没有数据库连接,如何配置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设置为两次签出之间连接池中希望创建新连接而不是返回现有连接的秒数.

Mysql相关问答推荐

如何在逗号分隔字符串值中使用LEFT函数

MySQL逻辑全部

运行简单查询时Prisma预准备语句错误

将上传文件的存储路径放在一张表中的缺点是什么?

Mysql - 按周分组但从 1 开始计数

Select 构成每天聚合 MAX 的各个行

将时间戳四舍五入到最接近的半小时而不遗漏丢失的数据

关于设置为 NOT NULL 时的 CHAR 默认值

无法从mysql数据库获取数据

使用 Having 表达式连接多个表

MySQL - 单词边界的正则表达式,不包括下划线(连接标点符号)

从多到多表中 Select 数据而无需重复

了解 Spring 和数据库级别的事务?

mysql错误:错误1018(HY000):无法读取'.'的目录(错误号:13)

当您无法修复表时,如何修复 MySQL不正确的密钥文件错误?

在 PHP 中获取 MySQL 列的总和

你如何 OR 两个 LIKE 语句?

Drupal 的默认密码加密方法是什么?

使用 Java 通过 SSH 连接到远程 MySQL 数据库

在mysql中复制没有数据的数据库 struct (带有空表)