是否有可能從名稱獲取ORM映射模型類?模型按名稱在SQLAlchemy
絕對SQLAlchemy有這個功能內置的地方。例如,在聲明式風格中,您可以編寫諸如blahs = relationship('Blah')
(注意:不需要模塊前綴)。我試圖找sqlalchemy.orm.properties.RelationshipProperty
裏面,但不知道當argument
字符串被實際的東西取代。
是否有可能從名稱獲取ORM映射模型類?模型按名稱在SQLAlchemy
絕對SQLAlchemy有這個功能內置的地方。例如,在聲明式風格中,您可以編寫諸如blahs = relationship('Blah')
(注意:不需要模塊前綴)。我試圖找sqlalchemy.orm.properties.RelationshipProperty
裏面,但不知道當argument
字符串被實際的東西取代。
解析器不可公開訪問;使用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
映射。
如果您對如何解決這些字符串關係感到好奇,請查看sqlalchemy.ext.declarative._deferred_relationship。這比你想象的要簡單。 – BenTrofatter