2012-05-20 3 views
2

데이터베이스 액세스를 위해 SQLAlchemy를 사용하는 Python 서버 응용 프로그램에서 작업하고 있습니다. 나는 데이터베이스 (Pylons 협약과 같은)에 접근하기 위해 프로그램 전체에서 사용되는 meta.py 모듈에 엔진, 세션 및 메타 데이터 객체를 갖고 싶습니다.파이썬에서 모듈 수준의 객체를 변경하려면 어떻게해야합니까? (Pylons 메타 오브젝트와 같이)

엔진 및 세션 객체는 meta.py 모듈에서 None으로 초기화되고 실제로 다른 모듈의 실제 값이 할당됩니다. 예 :

model/meta.py

:

engine = None 
Session = None 
metadata = Metadata() 

model/__init__.py : 내가 가져오고 meta.py에서 세션을 가져 오려면 다음, 다른 모듈에 init_model()을 실행할 때

from simplesite.model import meta 

def init_model(): 
    # ... 
    sm = orm.sessionmaker(...) 
    meta.Session = orm.scoped_session(sm) 

문제는 그것이 여전히 없음으로 설정되어 있습니다. 나는.

from model.meta import Session 
from model import init_model 

init_model() 
# Session is still None! 

누군가 이것이 왜 Pylons 응용 프로그램에서 어떻게 작동하는지 및/또는 어떻게 작동하는지 말해 줄 수 있습니까? 파이썬이 어떻게 작동하는지에 대한 대답이 더 근원적 일 것이라고 생각합니다.

응용 프로그램 전체에 단일 데이터베이스 액세스 권한을 부여하는 방법에 대한 대안 (예 : 대규모 응용 프로그램에서 SQLAlchemy를 사용하는 최상의 방법)도 고려해보십시오.

+3

이 괜찮습니다. 문제는'from model.meta import Session'은'meta.Session'의 값을'Session' 이름에 바인딩하고,'meta.Session' 이름이 바뀌면 바뀌지 않는다는 것입니다. 대신'model import meta'에서'Session'을'meta.Session'으로 찾아보기 만하면됩니다. – katrielalex

+2

사실, 다른 모듈의 코드가 로컬 변수를 바꿀 수 있다면 얼마나 불쾌 할 지 생각해 보라 !!_ !! – katrielalex

+0

고마워, 그게 내가 찾고 있던 대답이었다. 지금은 모델 가져 오기 메타를 사용하고 있습니다. 메타 세션으로 객체를 참조하면 작동합니다. – user1405990

답변

1

@katrielalex의 의견에 답변을 주었지만 여기에 앉아있는 것 같아서 대답하고 있습니다.

from model.meta import Session을 수행 할 때 해당 모듈의 개체에 바인딩 된 Session이라는 새 로컬 변수를 만듭니다. init_model()이 실행되면 meta 모듈 내부에서 이름을 리 바인드하지만 로컬 변수에는 영향을주지 않습니다.

당신은 init_model()이 작업을 수행 한 후 때까지 meta.Session에 접근하지 않음으로써 원하는 효과를 얻을 수 있습니다 : 당신이 무슨 일을하는지

from model import meta 
from model import init_model 
init_model() 
Session = meta.Session