2012-12-20 11 views
8

Ich verwende SQLAlchemy mit Flask wie hier gezeigt: http://flask.pocoo.org/docs/patterns/sqlalchemy/sqlalchemy DB Session mit Flask, Postgres

Ich habe eine Selen-Test-Suite, die zuerst mit Firefox läuft und dann mit Chrome.

Vor dem Start der Tests für jeden Browser werden Tabellen in der Testdatenbank (PostgreSQL) gelöscht und erstellt.

Es läuft perfekt für die ersten Browser, aber für den zweiten Browser friert der SQL-Create/Drop-Versuch einfach ein und es werden keine Fehler angezeigt.

Ich glaube, das ist wegen offener SQLAlchemy-Sitzungen, ist das richtig?

+2

Put-Stack-Trace hier –

Antwort

3

Ich glaube, das ist wegen offener SQLAlchemy-Sitzungen, ist das richtig?

Das ist höchstwahrscheinlich der Fall. Um dies zu bestätigen, verbinden Sie sich mit der postgres Datenbank und führen Sie SELECT * FROM pg_stat_activity;

Ich bin nicht sicher, wie Sie die DB Schöpfung umgehen/Drop Sie können jedoch dispose() und möglicherweise recreate() auf dem SQLAlchemy Verbindungspool anrufen mögen, nachdem sichergestellt wurde, dass jede Verbindung ausgecheckt zurückgegeben worden ist (zum Beispiel mit session.close()).

+0

Eine temporäre Lösung für mich war, Transaktionen zu deaktivieren, d. H. 'Autocommit = True' als' Engine'-Parameter. – Sri

+0

Interessant. Ich denke mit Autocommit gibt die Session die Verbindung sofort zum Pool zurück. Ich nehme an, dass zwischen den zwei aufeinander folgenden Tests, Ihre Maschine und Pool Müll gesammelt werden, nicht wahr? Das würde bedeuten, dass Sie zu dem Zeitpunkt, zu dem Ihre Engine zerstört wird, eine oder mehrere offene Transaktionen haben, von denen jede eine Verbindung zum PG-Server offen hält. –

0

Das passiert mir auch bei Flask unittest mit SQLAlchemy und Postgres. Oftmals ist der Schuldige eine Ausnahme, die sich nicht nach oben ausbreitete und stecken blieb. Diese Ausnahme verhindert auch, dass der Test ordnungsgemäß aufgeräumt wird und daher eingefroren wird.

Wenn Sie eine Testsuite erstellen, rufen Sie die Debug-Methode für die Klage auf und es wird die Ausnahme angezeigt. Verknüpft die Dokumente dieser Methode here.

Ihre Beobachtung einer offenen Sqlalchemy-Sitzung kann auch ein Grund sein. Ich werde morgen eine Theorie von mir anhand dieser Beobachtung testen. Wenn es Zweifel beseitigt, werde ich hier posten.

Schauen Sie sich answer, die zeigt, wie Sie Debugger auf Ausnahme auslösen können. Vielleicht kann es helfen, das Problem zu lokalisieren.

+0

Für mich war es eine nicht abgeschlossene Transaktion. Die Verwendung von 'autocommit = True' auf meiner' engine' behebt das Problem, indem im Grunde genommen keine Transaktionen mit Postgres durchgeführt werden. Nicht sicher, ob dies eine langfristige Lösung ist. – Sri

+0

'autocommit = True 'kann die Konsistenz Ihrer Daten beeinträchtigen, abhängig von Ihrer Anwendung. –

Verwandte Themen