5

是否可以从名称中获取 ORM 映射的模型类?

绝对 SQLAlchemy 在某处内置了此功能。例如,在声明式风格中,您可以编写诸如blahs = relationship('Blah')(注意:不需要模块前缀)之类的东西。我试着往里面看,sqlalchemy.orm.properties.RelationshipProperty但不知道什么时候argument字符串被实际的东西替换了。

4

1 回答 1

11

解析器不可公开访问;该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结构只是一个dictpython ;Base您还可以在创建类时指定自己的映射器:

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

class_registry然后您可以直接在映射中查找类。

于 2012-12-16T16:47:47.420 回答