1. ホーム
  2. python

[解決済み] sqlalchemyのモデルで定義されたカラムを反復処理する方法?

2022-10-14 10:13:42

質問

SQLAlchemyのモデルで定義されたカラムのリストに対して反復処理を行う方法を考えています。いくつかのモデルにシリアライズとコピーメソッドを書くために必要です。ただ単に obj.__dict__ には、SA 固有の項目がたくさん含まれているので、単純に反復処理することはできません。

どなたか iddesc の名前は、次の中から選びますか?

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 (を自動生成するようなものを希望します(大きなオブジェクトの場合)。

どのように解決するのですか?

以下のような関数を使用するとよいでしょう。

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 Mapper.mapped_table . 0.8 以降を使用している場合は Mapper.attrs と関連する関数も参照してください。

の例 Mapper.attrs :

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