2011-12-07 5 views
0

SQLAlchemy에 대한 모든 액세스를 래핑하는 오브젝트가 있습니다. 래퍼라고합니다. 어떤 세션도이 클래스가 문서에있는 스레드의 로컬이되도록 sqlalchemy.orm.scoped_session을 사용합니다. 자, 래퍼의 인스턴스를 만드는 마스터 스레드가 있습니다. 몇 개의 슬레이브 쓰레드는 Mater에 의해 생성되고 래퍼 (Wrapper)에 대한 참조를 전달합니다. 어떤 슬레이브는 래퍼 클래스 내에서 호출 어떤 SQLAlchemy의 호출SQLAlchemy, threads 및 table not such table errors

, 다음과 같은 오류가 발생합니다 : 내가 잘못 뭐하는 거지

DB Exception raied: DB Error: (OperationalError) no such table:[...] 

?

각 슬레이브에 대해 래퍼 인스턴스를 새로 만들어야합니까?

편집 : 나는 차이점이 있다면 (주로 테스트 용) 메모리 데이터베이스에 SQLite를 사용하고 있습니다. 그리고 승자는 : 메모리의 sqlite는 스레드간에 공유 될 수 없습니다. 그래서 메모리 1에 있지 않으면 래퍼에 엔진을 전달할 수 있습니다. verbose 옵션을 true로 설정하는 것은 매우 훌륭한 디버깅 도구입니다.

답변

1

예, 각 스레드에 래퍼를 만들거나 래퍼가 세션 풀을 유지하도록합니다.

+0

감사합니다. 래퍼에 무엇을 전달해야합니까? 나는 단지 엔진을 시험해 보았다. 그러나 그것은 나에게 아직도 오류를 준다. – Sardathrion

+1

연결 URI (예 : "sqlite : /// : memory :"또는 기타)를 전달한 다음 래퍼에서 엔진/세션을 만듭니다 (스레드 당 하나씩 갖고 싶다면). 편집 : 흠, 그것의 sqlite 메모리 db와 함께 일할 수 있을지 모르겠다 생각해 봤는데 – setrofim

+0

내가 할 경우, 나는 단지 슬레이브 스레드 내에서 sqlite : /// : 메모리의 다른 인스턴스를 만들기 때문에 오류가 발생합니다. 실제 데이터베이스 (일명 sqlite : ///ook.db)를 전달하면 정상적으로 전달할 수 있습니다. BTW, 아바타처럼^_ ~ GitS : SAC는 참으로 훌륭합니다. – Sardathrion