2012-12-20 1 views
8

다음과 같이 내가 플라스크와 SQLAlchemy의를 사용하고 있습니다 : http://flask.pocoo.org/docs/patterns/sqlalchemy/플라스크와 SQLAlchemy의 DB 세션, 포스트 그레스

내가 먼저 파이어 폭스와 함께 다음 크롬으로 실행하는 셀레늄 테스트 스위트가 있습니다.

각 브라우저에서 테스트를 시작하기 전에 테스트 데이터베이스 (PostgreSQL)의 테이블을 삭제하고 만듭니다.

첫 번째 브라우저에서는 완벽하게 실행되지만 두 번째 브라우저에서는 SQL 작성/놓기 시도가 멈추고 오류가 표시되지 않습니다.

이것이 열린 SQLAlchemy 세션 때문이라고 생각 하나?

+2

여기에 스택 추적 넣기 –

답변

3

저는 이것이 열린 SQLAlchemy 세션 때문이라고 생각합니다. 맞습니까?

대부분의 경우입니다. 이를 확인하려면 postgres 데이터베이스에 연결하고 SELECT * FROM pg_stat_activity을 실행하십시오.

난 당신이 떨어지고/DB를 생성을 처리하는 방법을 잘 모르겠어요하지만 당신은 session.close()으로 (예를 들어, 어떤 반환 된 연결을 체크 아웃 한 것을 확인한 후, SQLAlchemy의 연결 풀에 dispose() 가능성이 recreate()를 호출 할 수 있습니다).

+0

일시적인 해결책은 'autocommit = True'라는 트랜잭션을 '엔진'매개 변수로 사용하지 않도록 설정하는 것이 었습니다. – Sri

+0

흥미 롭습니다. 자동 커밋 (autocommit)을하면 세션이 풀에 즉시 연결을 반환한다고 생각합니다. 두 번의 연속적인 테스트 사이에 엔진과 풀이 가비지 수집 된 것 같습니다. 맞습니까? 그러면 엔진이 파괴 된 시점에 하나 이상의 열린 트랜잭션이 있으며 각 트랜잭션은 PG 서버에 대한 연결을 유지합니다. –

0

이것은 Flask unittest를 SQLAlchemy 및 Postgres와 함께 실행하는 경우에도 발생합니다. 많은 경우에, 범인은 예외적인데, 이는 위쪽으로 전파되지 않고 붙어 있습니다. 이 예외는 테스트가 제대로 정리되지 못하게하여 정지시킵니다.

테스트 스위트를 작성하는 경우 해당 슈트에서 디버그 메소드를 호출하면 예외가 표시됩니다. 이 방법의 문서 인 here을 연결했습니다.

열려있는 Sqlalchemy 세션에 대한 관찰도 이유가 될 수 있습니다. 내일이 관찰에 근거한 광산 이론을 시험해 보겠습니다. 그것이 몇 가지 의문을 없애 준다면 나는 여기에 올릴 것입니다.

예외로 디버거를 트리거하는 방법을 보여주는 answer을 살펴보십시오. 어쩌면 문제를 정확하게 지적하는 데 도움이 될 수 있습니다.

+0

제게는 거래가 끝나지 않았습니다. 내'엔진'에'autocommit = True'를 사용하면 기본적으로 포스트 그레스의 트랜잭션을 처리하지 않기 때문에 문제가 해결되었습니다. 이것이 장기적인 해결책인지 확실하지 않습니다. – Sri

+0

'autocommit = True'는 응용 프로그램에 따라 데이터의 일관성을 손상시킬 수 있습니다. –