いくつかの軽量データ変換(主にフィールド名の変更)を使用してMySQLデータベースからデータをエクスポートするための小さなsqlalchemyシムを作成しています。現在のスクリプトは正常に機能しますが、基本的にモデルを2回記述する必要があります。1回はクラス宣言で、もう1回は反復するフィールド名のリストとして記述します。
イントロスペクションを使用して、列アクセサーである行オブジェクトのプロパティを識別する方法を理解しようとしています。以下はほぼ完璧に機能します。
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のインスタンスでもあり、それらをスキップする必要があります。クラス辞書を調べているときに、この2つを区別する方法はありますか?
sqlalchemyのイントロスペクションで見つけたドキュメントのほとんどは、metadata.tableを調べることを含みますが、列の名前を変更しているため、そのデータは簡単にマッピングできません。