2017-01-16 6 views
0

クラスA(db.Modelから継承)からすべての適切なSQLAカラムを取得する簡単な方法を知っています - 実行時にA.__table__.columnsを実行できます。しかし、Aにもいくつかのアソシエーション・プロキシがあります。クラスの属性をすべて実行しているだけでなく、それらのリストを取得するためのエレガントな方法はわかりません。 SQLAの検査を使用する方法がありますか?SQLAlchemyクラス内のすべてのアソシエーションプロキシの検索

私はPython 2.7とFlask-SQLAlchemyを使用しています。

答えて

2

runtime inspection APIを使用する方法があります。それをあなたも__table__を通じてAの内部で突くする必要はありません:関連プロキシのリストについては

from sqlalchemy import inspect 

inspect(A).columns 

あなたが例えば

from sqlalchemy.ext.associationproxy import ASSOCIATION_PROXY 

proxies = [desc for desc in inspect(A).all_orm_descriptors 
      if desc.extension_type is ASSOCIATION_PROXY] 

all_orm_descriptorsを行うことができInspectionAttr属性の集合でありますこれには、マップされた属性と、拡張によって宣言された属性が含まれます。拡張子と非拡張子を区別するために、InspectionAttr.extension_type定数属性を検査してください。

+0

@everilaeありがとうございました。私は 'all_orm_descriptors'に慣れていませんでした。しかし、私が回避しなければならなかったことの1つは、検査から返されたアソシエーションプロキシオブジェクトが部分的であったという事実でした。私は 'remote_attr'や' local_attr'のような属性にほとんどアクセスできませんでした。 'Classオブジェクトは期待通りですが、 'None'を返します。プロキシの名前、そして 'getattr'を使用します。 さらに詳しい提案はありますか? – mcouthon

+1

'AssociationProxy' [descriptorオブジェクト](https://docs.python.org/3/howto/descriptor.html)の' attr'、 'remote_attr'、または' local_attr'にアクセスしようとするとエラーが発生します。最初にモデルクラスまたはインスタンスを介してアクセスしたことがあります。記述子は、クラス構築中にバインドされているクラスへの参照を取得しません。その代わりに、クラスと可能なインスタンスは、 'the_proxy .__ get __(None、A)'のように、アクセス時に記述子の '__get__'メソッドに渡されます。 'AssociationProxy'インスタンスは1回目の呼び出しで参照を保存しているようです。その後、' attr'などにアクセスすることができます。 –

+0

[Invoking Descriptors](https://docs.python.org/3/howto/descriptor.html#呼び出す記述子)を参照してください。 –

関連する問題