2010年5月12日水曜日

python elixir

appengineのdatastore実装が素敵過ぎて、他の案件でも使いたいのですが、
「顧客の要望」で「CGI環境」と言われちゃう事がままあり
そういうケースでは、djangoごと引っ張ってくるのは無理っぽい。

と思ってる人は多いはず。

筆者が試したのはelixirです。
http://elixir.ematia.de/trac/wiki

当時は0.6.0ぐらいだったと思います。

結論から言うと、悪くはないのですが、
sqlalchemyのwrapper的な生い立ちのせいか
微妙なところで変なアクが有りますね。


  • ModelというかEntityは、概ねdb.Modelの様な調子で書けます。
    • Field()への入れ子(?)宣言なのが何とも言えない。
  • 外部キー制約は、OneToMany(), OneToOne()で行けます。
    • 内部で、ReferenceProperty的挙動もやってくれます。
  • 定義したとおりのプロパティ名で、キーのリンク先データを引っ張ってくれます。
  • SQLに逐一送っちゃわずに、内部でトランザクションエミュレーションしてる模様。
  • setup_all()をやらないと、commit()でもデータを書き出してくれなかったとか。
  • 故に、データの書き出しは、Entityのsave()じゃなくて、session.commit()だったりとか。
    • # Entity.put = staticmethod(session.commit) #とかやっておくべきか?
  • setup_all()で、Entity.queryが沸いて出るとか。
  • Entityのquery.filer_by()関数で、新しいオブジェクトを返すので、それを変数に入れ忘れると、全件検索になっちゃうとか。
  • 複数カラムにまたがるインデックスを貼りたい場合は、sqlalchemyのクラスを引っ張ってくる必要が有っちゃったりとか。


その一方、実装は、pythonの限界に挑戦しちゃってる感があるので、参考になります。