2009-07-07 4 views
1

외부 응용 프로그램의 데이터로 미리 작성된 여러 sqlite3 데이터베이스를 사용하는 응용 프로그램을 수행하고 있습니다. 각 데이터베이스는 테이블이 동일하지만 데이터가 다릅니다.런타임 동안 TG2의 데이터베이스 전환

사용자 입력에 따라 이러한 데이터베이스간에 전환 할 수 있기를 원합니다. TurboGears 2에서 가장 우아한 방법은 무엇입니까?

+0

거의 모든 다른 디자인이 이보다 낫습니다. 여러 소스에서 단일 데이터베이스를로드 할 수없는 이유는 무엇입니까? –

+0

또는 현재 데이터베이스에 외부 데이터베이스를 연결하십시오. 그 (것)들은 동일한 연결에서, 다만 다른 이름 공간에서 인처럼 행동하게합니다. – Christopher

+0

모든 것을 하나의 데이터베이스에로드하려면 스키마를 수정해야하며, 다른 응용 프로그램이 해당 스키마에 의존하기 때문에이를 수행 할 수 없습니다. ATTACH 제안은 흥미로운 것으로 들리지만 내 경우에는 작동하도록 만드는 방법을 생각할 수 없습니다. 내 모델을 선언적으로 구축하기 위해 sqlalchemy를 사용하고 있으며 각 모델 클래스는 tablename과 연결되어 있습니다. 동일한 데이터베이스를 연결하려면 각 tablename 앞에 sqlalchemy를 구분하는 식별자를 추가해야합니다. – dzhelil

답변

1

모든 데이터베이스가 동일한 스키마를 가지고 있다면 동일한 모델을 사용하여 여러 DB에 여러 개의 세션을 생성 할 수 있어야합니다.

1

Dzhelil,

나는 블로그가 다시 TG2에서 여러 데이터베이스를 사용하는 방법에 대해 잠시 게시 썼다. 이 방법을 여러 개의 DBSession에 대한 Jorge의 제안과 결합하여 쉽게 수행 할 수 있다고 생각합니다. 이 도움이

How to use multiple databases in TurboGears 2.0

희망, 내가 읽기 전용 응용 프로그램이 데이터베이스를 사용하고 세스

1

. 두 번째 데이터베이스는 기본 데이터베이스가 다운 된 경우 캐시입니다. 두 객체를 사용하여 연결, 메타 데이터 및 호환 가능한 Table 인스턴스를 보유합니다. 뷰 함수의 맨 위는 db = primary 또는 db = secondary이며 나머지는 db.tableA.join(db.tableB)에 대한 쿼리입니다. ORM을 사용하지 않습니다.

스키마는 완전히 동일하지 않습니다. 기본 데이터베이스는 schema. (Table(...schema='schema'))이며 캐시 데이터베이스는 필요하지 않습니다. 이 문제를 해결하기 위해 스키마 이름을 인수로 사용하는 함수에서 테이블 개체를 만듭니다. 각 데이터베이스에 대해 함수를 한 번 호출하면 호환 접두사 및 접두사가없는 Table 개체와 호환됩니다.

적어도 Pylons에서 SQLAlchemy meta.SessionScopedSession입니다. 응용 프로그램의 BaseControllerappname/lib/base.py으로 각 요청 후 Session.remove()을 호출합니다. 두 데이터베이스 모두에 대해 하나의 Session이있는 것이 좋지만, 그렇지 않은 경우 각 Session.remove()을 호출하여 BaseController을 수정해야 할 수도 있습니다.