2012-12-20 9 views
8

ここに示したように、私はフラスコでSQLAlchemyのを使用しています:http://flask.pocoo.org/docs/patterns/sqlalchemy/フラスコとSQLAlchemyのDBセッション、Postgresの

は、私が最初にFirefoxで、その後、Chromeで実行されるSeleniumテストスイートを持っています。

各ブラウザでテストを開始する前に、テストデータベース(PostgreSQL)のテーブルを削除して作成します。

これは最初のブラウザでは完全に動作しますが、2番目のブラウザではSQLの作成/削除の試行がフリーズし、エラーは表示されません。

私はこれが開いているSQLAlchemyセッションのためだと思います、それは間違いありませんか?

+2

スタックトレースをここに入れます –

答えて

3

これはオープンSQLAlchemyセッションのためだと思いますが、それは間違いありませんか?

ほとんどの場合そうです。確認するには、postgresデータベースに接続し、SELECT * FROM pg_stat_activityを実行してください。

は、私はあなたが落下/ DBの作成を扱うかどうかはわかりませんが、あなたはsession.close()で、例えば(いずれかが返された接続をチェックアウトすることを確認した後、SQLAlchemyの接続プールにdispose()そしておそらくrecreate()を呼び出したいこと)。

+0

一時的な解決策はトランザクションを無効にすることでした。つまり、 'autocommit = True'を' engine'パラメータとして無効にすることでした。 – Sri

+0

興味深い。自動コミットでは、セッションがすぐにプールに接続を返すと思います。 2つの連続したテストの間に、エンジンとプールがガベージコレクションされていると思われます。そうすれば、エンジンが破壊された時点で1つ以上の開いているトランザクションがあり、それぞれがPGサーバーに接続を維持していることを意味します。 –

0

これは、Flask unittestをSQLAlchemyとPostgresで実行しているときにも起こります。多くの場合、犯人は例外であり、上方に伝播せずに立ち往生しています。この例外は、テストが正常にクリーンアップされず、したがってフリーズも停止します。

テストスイートを作成する場合、そのスーツについてデバッグメソッドを呼び出すと例外が表示されます。このメソッドのドキュメントをリンクしましたhere

オープンされたSqlalchemyセッションを観察したことも理由です。私は明日のこの観察に基づいて私の理論を試してみましょう。それがいくつかの疑問をクリアすれば、私はここに投稿します。

このanswerを見ると、デバッガを例外で起動する方法が示されています。たぶん問題を特定するのに役立つかもしれません。

+0

私のために、それは閉鎖されていない取引でした。私の 'エンジン'で 'autocommit = True'を使うと、基本的にはポストグルのトランザクションでは動作しないという問題を解決しました。これが長期的な解決策であるかどうかは不明です。 – Sri

+0

'autocommit = True'は、アプリケーションに応じて、データの一貫性を損なう可能性があります。 –

関連する問題