7

我正在编写一个小型 sqlalchemy shim 来从 MySQL 数据库中导出数据,并进行一些轻量级的数据转换——主要是更改字段名称。我当前的脚本工作正常,但需要我基本上描述我的模型两次——一次在类声明中,一次作为要迭代的字段名称列表。

我试图弄清楚如何使用自省来识别作为列访问器的行对象的属性。以下工作几乎完美:

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

除了我的对多关系访问器也是 sqlalchemy.orm.attributes.InstrumentedAttribute 的实例,我需要跳过这些。在我检查类字典时,有什么方法可以区分两者吗?

我在 sqlalchemy introspection 上找到的大多数文档都涉及查看 metadata.table,但由于我正在重命名列,因此该数据并非可轻松映射。

4

3 回答 3

7

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

list(User.__mapper__.columns)

每列都有几个属性,包括name(可能与名为 的映射属性不同key)、nullable等等unique...

于 2010-08-01T05:26:24.963 回答
1

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

于 2010-08-01T05:14:20.433 回答
1

实例InstrumentedAttribute有一个名为的属性impl,实际上是 a ScalarAttributeImpl、 aScalarObjectAttributeImpl或 a CollectionAttributeImpl

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

于 2012-08-30T21:09:01.747 回答