Python SQLALchemy数据库会话与Flask,Postgres

Python SQLALchemy数据库会话与Flask,Postgres,python,postgresql,sqlalchemy,flask,Python,Postgresql,Sqlalchemy,Flask,我将SQLAlchemy与烧瓶一起使用,如下所示: 我有一个Selenium测试套件,先用Firefox运行,然后用Chrome运行 在每个浏览器上开始测试之前,删除并创建测试数据库(PostgreSQL)中的表 它在第一个浏览器中运行得很好,但在第二个浏览器中,SQL创建/删除尝试只是冻结,不会显示任何错误 我相信这是因为开放的SQLAlchemy课程,对吗 我相信这是因为开放的SQLAlchemy课程,对吗 很可能是这样。要确认,请连接到postgres数据库并运行SELECT*FROM p

我将SQLAlchemy与烧瓶一起使用,如下所示:

我有一个Selenium测试套件,先用Firefox运行,然后用Chrome运行

在每个浏览器上开始测试之前,删除并创建测试数据库(PostgreSQL)中的表

它在第一个浏览器中运行得很好,但在第二个浏览器中,SQL创建/删除尝试只是冻结,不会显示任何错误

我相信这是因为开放的SQLAlchemy课程,对吗

我相信这是因为开放的SQLAlchemy课程,对吗

很可能是这样。要确认,请连接到
postgres
数据库并运行
SELECT*FROM pg_stat_activity


我不确定如何处理DB创建/删除,但在确保已返回任何签出的连接(例如,使用
session.close()
)后,您可能需要在SQLAlchemy连接池上调用
dispose()
,并可能调用
recreate()
)使用SQLAlchemy和Postgres运行Flask unittest时,我也遇到了这种情况。很多时候,罪魁祸首是一个例外,它没有向上传播并被卡住。此异常也会阻止测试正确清理,从而导致冻结

如果您正在创建一个测试套件,那么在套件上调用debug方法,它将显示异常。链接此方法的文档

您对开放式Sqlalchemy会话的观察也可能是一个原因。明天我将根据这一观察结果检验我的一个理论。如果它消除了一些疑问,那么我将在这里发布


看看这个例子,它展示了如何在异常时触发调试器。也许这有助于找出问题所在。

对我来说,这是一笔未结清的交易。在我的
引擎上使用
autocommit=True
基本上不处理postgres上的事务,解决了这个问题。不确定这是否是一个长期解决方案。
autocommit=True
会影响数据的一致性,具体取决于您的应用程序。我的一个临时解决方案是禁用事务,即
autocommit=True
作为
引擎
参数。很有趣。我认为使用autocommit,会话会立即将连接返回到池。我想在连续两次测试之间,您的引擎和池被垃圾收集,对吗?这意味着在引擎被破坏时,您有一个或多个打开的事务,每个事务都保持与PG服务器的连接打开。