2015-02-07 3 views
0

나는 MongoDB and Pyramid에 대한 피라미드 요리 책 지침을 따랐지만 데이터베이스 쿼리를 request.db에 링크하는 것으로 보인다. 클래스 메서드 내에서 호출 할 수있는 연결을 열려면 어떻게해야합니까?피라미드에서 뷰 외부에서 MongoDB 연결에 액세스하려면 어떻게해야합니까?

내 프로젝트의 개체에 대해 실제 베어 본 시리얼 라이저를 설정하려고합니다. 내 프로젝트 데이터를 처리하기 위해 내 resources/ 폴더에 여러 클래스 정의가 있습니다. 이 객체들 각각에 .save().find() 메쏘드를 (mongoengine과 유사하게) 객체의 데이터를 사전으로 변환하고 pymongo을 사용하여 MongoDB에 저장하는 자급 적 방법을 제공하고 싶습니다.

pymongo을 사용하여 MongoDB에 연결하기에 충분합니다. 당신이해야 할 일은 MongoClient입니다. 문제는 개체를 인스턴스화하거나 클래스를 호출 할 때마다 새 연결을 열지 않으려한다는 것입니다. 하나의 연결을 달걀의 main() 함수에서 만들고 싶습니다. 필요한 시점에 액세스 할 수 있습니다 (보기에서 request.db처럼).

필자는 분명히 피라미드의 새로운 제품이므로 어떤 도움도 받으실 수 있습니다. 미리 감사드립니다.

답변

0

리소스/패키지 내에 MongDB 연결을 초기화하고 보유하는 모듈을 만들 것입니다.

예. 자원/connection.py 앱의 주요 기능에 다음

import pymongo 

db = None 

def initialize(settings): 
    global db 
    db = MongoClient(settings['mongo_uri']) 

:이

from myapp.resources import connection 

connection.db.posts 

이럴 : 다른 모듈에서

from myapp.resources import connection 


def main(global_config, **settings): 
    # ... 
    connection.initialize(settings) 
    # ... 
    config.add_request_method(lambda request: connection.client, 'db', reify=True) 

(안 뷰), 단지 연결 모듈을 가져 접근 방식은 요리 책에 설명 된 접근 방식보다 확장 성이 뛰어나고 단위 테스트가 가능합니다.

+0

스레딩이 작동 할 때이 메서드는 예측할 수없는 방식으로 중단되므로 threadlocal 개체를 사용하고 싶습니다. 요리 책 응답이 훨씬 뛰어납니다. 이렇게하면 요청을 모델로 전달해야하지만 대부분의 경우 문제가되지 않으므로 테스트 가능성이 높아집니다. –

+0

pymongo의 MongoClient는 스레드로부터 안전하며 실제로 연결 풀 역할을합니다. [링크] (http://api.mongodb.org/python/current/faq.html#how-does-connection-pooling-work-in-pymongo) –