今僕は、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