sqlalchemy モデルの定義済み列を反復処理する方法は? 質問する

sqlalchemy モデルの定義済み列を反復処理する方法は? 質問する

SQLAlchemy モデルで定義された列のリストを反復処理する方法を考えています。いくつかのモデルにシリアル化とコピー メソッドを記述するためにこれが必要です。SAobj.__dict__​​ 固有の項目が多数含まれているため、単純に反復処理することはできません。

以下の名前idだけを取得する方法をご存知の方はいらっしゃいますか?desc

class JobStatus(Base):
    __tablename__ = 'jobstatus'

    id = Column(Integer, primary_key=True)
    desc = Column(Unicode(20))

この小さなケースでは、次のものを簡単に作成できます。

def logme(self):
    return {'id': self.id, 'desc': self.desc}

dictただし、 (大きなオブジェクトの場合は)自動生成するものの方が好ましいです。

ベストアンサー1

次の関数を使用できます。

def __unicode__(self):
    return "[%s(%s)]" % (self.__class__.__name__, ', '.join('%s=%s' % (k, self.__dict__[k]) for k in sorted(self.__dict__) if '_sa_' != k[:4]))

SAは除外される魔法属性は除外されますが、関係は除外されません。したがって、基本的には依存関係、親、子などがロードされる可能性がありますが、これは決して望ましいことではありません。

Baseしかし、実際には、 を継承すると属性が得られるので__table__、次のように実行できるようになり、はるかに簡単になります。

for c in JobStatus.__table__.columns:
    print c

for c in JobStatus.__table__.foreign_keys:
    print c

見るSQLAlchemy のマップされたオブジェクトからテーブル プロパティを検出する方法- 同様の質問です。

編集者:マイク:次のような機能をご覧くださいマッパー.cそしてマッパー.マップされたテーブル0.8以上を使用している場合は、マッパー属性および関連機能。

マッパー属性:

from sqlalchemy import inspect
mapper = inspect(JobStatus)
for column in mapper.attrs:
    print column.key

おすすめ記事