SQLAlchemy中的模型名称

Posted

技术标签:

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

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

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

【问题讨论】:

如果您对如何解决这些字符串关系感到好奇,请查看 sqlalchemy.ext.declarative._deferred_relationship。它比您想象的要简单。 【参考方案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 映射中查找类。

【讨论】:

以上是关于SQLAlchemy中的模型名称的主要内容,如果未能解决你的问题,请参考以下文章

无法从 sqlalchemy 插入到 mysql

python flask orm sqlalchemy 实例

python flask orm sqlalchemy 实例

Flask-SQLAlchemy 的隔离级别

爱上 SQLAlchemy 的 10 个理由(转)

Flask 进阶系列:SQLAlchemy 扩展学习