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中的模型名称的主要内容,如果未能解决你的问题,请参考以下文章
python flask orm sqlalchemy 实例