在SQLAlchemy中按名称建模

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映射中查找类.