我正在编写一个小型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,但由于我正在重命名列,因此这些数据并不是可以轻易映射的。
答案 0 :(得分:7)
每个映射实体的Mapper都有一个属性columns
,其中包含所有列定义。例如,如果您有一个声明性类User
,则可以使用User.__mapper__
和以下列的列访问映射器:
list(User.__mapper__.columns)
每列都有多个属性,包括name
(可能与名为key
的映射属性不同),nullable
,unique
等等。
答案 1 :(得分:1)
我仍然希望看到这个问题的答案,但我已经通过名称来修改关系访问器(例如'_otherentity'而不是'otherentity')然后过滤名称。适合我的目的。
答案 2 :(得分:1)
InstrumentedAttribute
个实例有一个名为impl
的属性,实际上是ScalarAttributeImpl
,ScalarObjectAttributeImpl
或CollectionAttributeImpl
。
我不确定这是多么脆弱,但我只是检查确定一个实例最终是返回列表还是单个对象。