SQLAlchemy对声明性类的内省

时间:2010-07-31 23:41:26

标签: python sqlalchemy introspection declarative

我正在编写一个小型sqlalchemy垫片,用于从MySQL数据库导出数据,其中包含一些轻量级数据转换 - 主要是更改字段名称。我当前的脚本工作正常,但要求我基本上在类声明中描述我的模型一次 - 一次作为字段名称列表来迭代。

我正在试图找出如何使用内省来识别作为列访问器的行对象的属性。以下工作几乎完美:

for attr, value in self.__class__.__dict__.iteritems():
    if isinstance(value, sqlalchemy.orm.attributes.InstrumentedAttribute):
        self.__class__._columns.append(attr)

除了我的to-many关系访问器也是sqlalchemy.orm.attributes.InstrumentedAttribute的实例,我需要跳过它们。在检查班级词典时,有没有办法区分这两者?

我在sqlalchemy内省上发现的大部分文档都涉及到metadata.table,但由于我正在重命名列,因此这些数据并不是可以轻易映射的。

3 个答案:

答案 0 :(得分:7)

每个映射实体的Mapper都有一个属性columns,其中包含所有列定义。例如,如果您有一个声明性类User,则可以使用User.__mapper__和以下列的列访问映射器:

list(User.__mapper__.columns)

每列都有多个属性,包括name(可能与名为key的映射属性不同),nullableunique等等。

答案 1 :(得分:1)

我仍然希望看到这个问题的答案,但我已经通过名称来修改关系访问器(例如'_otherentity'而不是'otherentity')然后过滤名称。适合我的目的。

答案 2 :(得分:1)

InstrumentedAttribute个实例有一个名为impl的属性,实际上是ScalarAttributeImplScalarObjectAttributeImplCollectionAttributeImpl

我不确定这是多么脆弱,但我只是检查确定一个实例最终是返回列表还是单个对象。