jul*_*icz 4 python reflection orm sqlalchemy
是否可以从名称中获取ORM映射的模型类?
绝对是SQLAlchemy在某处内置了这个功能.例如,在声明式样式中,您可以编写类似的东西blahs = relationship('Blah')(注意:不需要模块前缀).我试着看里面,sqlalchemy.orm.properties.RelationshipProperty但无法弄清楚什么时候argument字符串被实际的东西取代.
Mar*_*ers 10
解析器无法公开访问; 使用该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]
Run Code Online (Sandbox Code Playgroud)
哪个cls是声明性类(派生自Base).从代码中可以看出,解析名称的一种方法是使用cls._decl_class_registry结构,给定一个类Foo,您可以'Blah'使用将字符串解析为类Foo._decl_class_registry['Blah'].
该._decl_class_registry结构仅仅是一个蟒dict; 您还可以在创建Base类时指定自己的映射器:
class_registry = {}
Base = declarative_base(class_registry=class_registry)
Run Code Online (Sandbox Code Playgroud)
然后你可以直接在class_registry映射中查找类.
| 归档时间: |
|
| 查看次数: |
1816 次 |
| 最近记录: |