2012-12-16 44 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函數。

該函數使用以下邏輯來解析名稱:

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] 

其中cls是一種聲明類(來自Base導出)。從代碼中可以看出,解析名稱的一種方法是使用cls._decl_class_registry結構(給定類Foo),則可以使用Foo._decl_class_registry['Blah']將字符串'Blah'解析爲類。

._decl_class_registry結構只是一個python dict;創建Base類時,你還可以指定自己的映射:

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

,然後你可以直視補課的class_registry映射。