2012-12-16 2 views
4

이름에서 ORM 매핑 모델 클래스를 가져올 수 있습니까?SQLAlchemy의 모델 이름

확실히 SQLAlchemy에는 어딘가에이 기능이 내장되어 있습니다. 예를 들어 선언적 스타일에서는 blahs = relationship('Blah')과 같은 것을 쓸 수 있습니다 (주의 : 모듈 접두사는 필요하지 않습니다). 나는 sqlalchemy.orm.properties.RelationshipProperty 내부를 들여다 보았지만 argument 문자열이 실제 것으로 바뀌면 알아낼 수 없습니다.

+0

문자열 관계가 어떻게 처리되는지 궁금하다면 sqlalchemy.ext.declarative._deferred_relationship을보십시오. 생각보다 간단합니다. – BenTrofatter

답변

7

해결 프로그램에 공개적으로 액세스 할 수 없습니다. sqlalchemy.ext.declarative._deferred_relationship 함수가 사용되며 중첩 된 (숨겨진) resolve_arg 함수가 있습니다.

함수 이름을 확인하기 위해 다음의 로직을 사용

cls은 ( Base로부터 유래) 선언적 클래스이다
def access_cls(key): 
    if key in cls._decl_class_registry: 
     return _GetColumns(cls._decl_class_registry[key]) 
    elif key in cls.metadata.tables: 
     return cls.metadata.tables[key] 
    elif key in cls.metadata._schemas: 
     return _GetTable(key, cls.metadata) 
    else: 
     return sqlalchemy.__dict__[key] 

. 코드에서 알 수 있듯이 이름을 확인하는 한 가지 방법은 Foo 클래스를 사용하여 cls._decl_class_registry 구조를 사용하는 것입니다. 문자열을 Foo._decl_class_registry['Blah']을 사용하여 해결할 수 있습니다.

._decl_class_registry 구조는 단지 파이썬 dict입니다.

class_registry = {} 
Base = declarative_base(class_registry=class_registry) 

을 한 다음은 class_registry 매핑에서 직접 클래스를 찾아 볼 수 있습니다 다음 Base 클래스를 만들 때 당신은 또한 당신의 자신의 매퍼를 지정할 수 있습니다.