2009-09-18 3 views
0

업데이트 다음 WERKZEUG link text 튜토리얼을 통해가는이WERKZEUG 및 SQLAlchemy의 0.5 배 세션

, sessionmaker를 사용하여 SQLAlchemy의 세션을 만드는() 대신 권장 create_session()와 중첩되었다.

참고 : SA에 관한 것이 아니라 Werkzeug에 관한 것입니다.

WERKZEUG 튜토리얼 :

session = scoped_session(lambda: sessionmaker(bind=application.database_engine)(), 
    local_manager.get_ident) 

이 나에게 도움이 #pocoo RCI의 결과들로

:

session = scoped_session(lambda: create_session(bind=application.database_engine, 
    autoflush=True, autocommit=False), local_manager.get_ident) 

나는 같은 사용 sessionmaker()을 달성하는 방법을 물었다 sessionmaker (** args) 끝에 ()이 없으면 계속 오류가 발생했습니다.

RuntimeError : 응용 프로그램에 바인딩 된 개체가 없습니다.

P.S. 람다을 삭제하면 작동하지 않습니다.

답변

4

sessionmaker()은 세션 자체가 아니라 세션 팩토리를 반환합니다. scoped_session()은 세션 팩토리를 인수로 취합니다. 따라서 lambda:을 생략하고 sessionmaker()의 결과를 scoped_session()에 직접 전달하십시오.

+1

언급하지 않았지만, 나는 Werkzeug lib와 SA로 놀고있다. SA 자습서에서 권장하는대로 session_create() 대신 SA sessionmaker()를 채택하려고합니다. #pocoo IRC의 사람들이 나를 도와 주었지만 여전히 트릭이 무엇인지 알지 못했습니다. 그들은 sessionmaker() 끝에 "()"를 추가하고 이제는 작동합니다. session = scoped_session (lambda : sessionmaker (bind = application.database_engine, autoflush = True, autocommit = False)(), local_manager.get_ident) – VVP

+1

자신, 코드 독자 및 파이썬 인터프리터를 위해 더 많은 작업을하고 있습니다. 개미 Aasma를 듣는 대신에 그것을 쓰는 것. 'scoped_session'을 깨기도합니다. 당신의 코드는'sessionmaker'를 생성 한 다음 (세션을 반환하는) 그것을 호출하고, 람다 (lambda)로 그 세션을'scoped_session'으로 전달합니다. 그래서'scoped_session'이 새로운 세션을 리턴하려고 할 때마다 실제로 동일한 세션을 리턴합니다. 'lambda'를 생략하고 sessionmaker 호출의 끝에서()를 버리십시오. 'scoped_session (sessionmaker (* args))' – jcdyer