Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

SQLAlchemyのオブジェクトモデルを辞書型で取得する方法

今僕は、SQLAlchemyとTornadoを使ったアプリケーションを書いています。

declarative_baseを使ってデータモデルを作っているのですが、templateに直接SQLAlchemyのオブジェクトを流し込んだら、以下のようなエラーになってしまいました。

    TypeError: 'YourObject' object is not subscriptable

どうやらSQLAlchemyのオブジェクトにはgetitemが実装されていなくて、そのままでは辞書型のように扱うことができないみたいです。
できないなら、実装すればいいって言う事で、拡張しました。

class BaseBase(object):
  def toDict(self):
    model = {}
    for column in self.__table__.columns:
        model[column.name] = str(getattr(self, column.name))
    return model

Base = sqlalchemy.ext.declarative.declarative_base(cls=BaseBase)

class YourDataModel(Base):
  __tablename__ = 'yourdatamodel'
  id = Column(Integer, Sequence('yourdatamodelid'), primary_key=True)
...
...
...

拡張用のクラス(ここではBaseBase)にtoDictメソッドを用意して、declarative_baseを呼び出すときに拡張用のクラスを渡してあげることで、できあがるクラスが拡張できるようです。

これで、SQLAlchemyのオブジェクトを取得して、以下のようにObject.toDict()とすることで辞書型のデータが取得できるようになりました。

session.query(YourDataModel).one().toDict()

getitemを実装しても良かったのですが、SQLAlchemyのバージョンアップで実装されることになった時に競合しちゃうのはよくないので、今回は別メソッドを定義しました。

参考URL
http://stackoverflow.com/questions/1958219/convert-sqlalchemy-row-object-to-python-dict
http://d.hatena.ne.jp/podhmo/20120305/1330955494