是否可以从名称中获取 ORM 映射的模型类?
绝对 SQLAlchemy 在某处内置了此功能。例如,在声明式风格中,您可以编写诸如blahs = relationship('Blah')
(注意:不需要模块前缀)之类的东西。我试着往里面看,sqlalchemy.orm.properties.RelationshipProperty
但不知道什么时候argument
字符串被实际的东西替换了。
是否可以从名称中获取 ORM 映射的模型类?
绝对 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]
wherecls
是声明性类(派生自Base
)。从代码中可以看出,解析名称的一种方法是使用cls._decl_class_registry
结构,给定一个 class Foo
,您可以'Blah'
使用Foo._decl_class_registry['Blah']
.
._decl_class_registry
结构只是一个dict
python ;Base
您还可以在创建类时指定自己的映射器:
class_registry = {}
Base = declarative_base(class_registry=class_registry)
class_registry
然后您可以直接在映射中查找类。