【问题标题】:Model by name in SQLAlchemySQLAlchemy中的模型名称
【发布时间】:2012-12-16 15:42:22
【问题描述】:

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

SQLAlchemy 肯定在某处内置了此功能。例如,在声明式风格中,您可以编写 blahs = relationship('Blah') 之类的东西(注意:不需要模块前缀)。我尝试查看 sqlalchemy.orm.properties.RelationshipProperty 内部,但无法弄清楚 argument 字符串何时被实际替换。

【问题讨论】:

  • 如果您对如何解决这些字符串关系感到好奇,请查看 sqlalchemy.ext.declarative._deferred_relationship。它比您想象的要简单。

标签: python reflection orm sqlalchemy


【解决方案1】:

解析器不可公开访问;使用了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,您可以将字符串'Blah' 解析为使用Foo._decl_class_registry['Blah'] 的类。

._decl_class_registry 结构只是一个 python dict;您还可以在创建Base 类时指定自己的映射器:

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

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

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 2014-01-16
    • 2012-01-02
    • 2013-11-06
    • 2018-09-24
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多