2012-12-20 31 views
8

我使用的SQLAlchemy与瓶如下所示:http://flask.pocoo.org/docs/patterns/sqlalchemy/SQLAlchemy的DB会话与瓶,Postgres的

我首先用Firefox,然后用浏览器运行Selenium测试套件。

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

它对于第一个浏览器运行完美,但对于第二个浏览器,SQL创建/删除尝试只是冻结并且不显示错误。

我相信这是因为开放SQLAlchemy的会议,是正确的?

+2

把堆栈跟踪放在这里 –

回答

3

我相信这是因为打开SQLAlchemy会话,是否正确?

这很可能是这种情况。要确认,连接到数据库postgres和运行SELECT * FROM pg_stat_activity;

我不知道你是如何处理的DB创建/下探,但你可能需要调用dispose()并可能recreate()在SQLAlchemy的连接池,确保所有签出连接已经恢复(例如后,用session.close() )。

+0

对我来说,一个临时解决方案是禁用事务,即'autocommit = True'作为'engine'参数。 – Sri

+0

有趣。我认为使用自动提交会话会立即返回连接池。我想在连续两次测试之间,你的发动机和水池是垃圾收集的,对吗?那么这将意味着你当时有一个或多个开放交易你的引擎被摧毁,其中的每一个留着给PG服务器开放的连接。 –

0

这是我在使用SQLAlchemy和Postgres运行Flask unittest时发生的事情。很多时候,罪魁祸首是一个例外,它并没有向上传播并且陷入困境。这个例外也会阻止测试正确清理并因此冻结。

如果要创建一个测试套件,然后调用西装调试方法,它会显示异常。链接此方法的文档here

你一个开放的SQLAlchemy会话的观察也可以是有原因的。我将在明天根据这个观察来测试一个我的理论。如果它清除了一些疑惑,我会在这里发帖。

看看这个answer,它显示了如何在异常时触发调试器。也许它可以帮助查明问题。

+0

对我而言,这是一笔未交易的交易。在我的'engine'上使用'autocommit = True'解决了这个问题,通过基本上不处理postgres事务。不知道这是否是一个长期解决方案。 – Sri

+0

'自动提交= TRUE'会危及你的数据的一致性,这取决于你的应用程序。 –