GoogleAppEngineのモデルをいじってみた

なんの幸運か、Softbank(しかもJ-phone時代からの)ユーザだったので、SMS認証もアッサリ通ってGAEのアカウントをゲットしたわけですが・・・(ただしiPhoneには興味ほぼなし)。

というわけで ishikawaさんがブログをGAEに移行された 、というのを知って俺も移行しようかなあとか思いつつブログアプリ作りました。すでに今ブログで使っている機能は全て実装済みだったりします。デザインも全頁XHTMLTr validでCSSもvalidなことを確認済みだったりします。しかも Django じゃなくて web.py だったりします。慣れてるしね。

それはおいといて、データストアまわりがそのままだと

  • filter("hoge =", value) が長ったらしい
  • CRUDが微妙。
  • フォーム作成用等に空のモデルを一時的に作成したいけど、作成した時点でvalidateされるので作成できない

らへんがいまいちだったで、ちょっといじってみました。

 1def _getattr(self, name):
 2  if name.endswith("_eq"):
 3    return lambda v: self.filter("%s ="%name[:-3], v)
 4  raise AttributeError(name)
 5setattr(db.Query, "__getattr__", _getattr)
 6
 7class ModelMixin(object):
 8
 9  default_order = None
10  _stab_class = None
11
12  @classmethod
13  def stab(cls):
14    if not cls._stab_class:
15      stab = type('Stab%s'%cls.__name__, (cls,), dict())
16      for k,v in stab._properties.iteritems():
17        v.required = False
18        v.choice   = None
19        v.validator= None
20      cls._stab_class = stab
21    stab = cls._stab_class()
22    for k,v in stab._properties.iteritems():
23      v.__set__(stab, v.default_value())
24    return stab
25
26  @classmethod
27  def create(cls, *a, **k):
28    obj = cls(*a, **k)
29    obj.put()
30    return obj
31
32  @classmethod
33  def find_all(cls):
34    result = cls.all()
35    if cls.default_order is not None:
36      return result.order(cls.default_order)
37    return result
38
39  def update(self, **k):
40    for prop in self.properties().values():
41      if prop.name in k:
42        prop.__set__(self, k[prop.name])
43    self.put()
44
45  def destroy(self):
46    self.delete()

これで

1class Test(ModelMixin, db.Model):
2  name = db.StringProperty(require=True)
3  created_at = db.DatetTmeProperty(auto_now_add=True)
4
5  default_order="-created_at"
6
7Test.find_all() # created_atの降順
8Test.all().name_eq("user").update(created_at = datetime.now())
9stab = Test.stab() #nameがなくても作成できる

こんな感じにかけます。

さて、そんなこんなでブログアプリを作ったのはいいんだけど、なんとなく移行する気にならない。現在はWordpressで運用しているけど、正直セキュリティホールは多いし、ソースコードを見ると泣きたくなるようなコードだし、頻繁なバージョンアップはめんどくさい・・・。プラグインのセキュリティホールまで考えるとなおめんどくさい。しかもそこまで機能を使い倒しているわけじゃないし。

だからGAEにでも移行したいんだけど・・・。データがGoogleに握られるのはそこまで心配じゃない。ブログサービスでブログをやれば、そのブログサービス事業者にデータを握られるってのと同じだから気にならないんだな。移行作業自体も記事数がかなり少ないのでそんなにめんどくさそうではない。

ひとつ引っかかっているのはトランザクションの問題。まぁめったにトランザクションで問題はおきないと思うけど、GAEのトランザクションは一応ある、といった程度でほとんど使えない。使おうとしたらtransactionの中でこれはしちゃだめ、これもしちゃだめ、とおこられまくったので現在トランザクション管理ができていない。GAEには集約系のメソッドがないので、月別記事数とか、タグ別記事数とかを記事のCRUD時に別モデルで管理しているわけだけど、ここのトランザクションが管理できないのは結構不安。

もうひとつはなんとなーく使い切らないんだけど無料の上限である500Mという容量が微妙。画像のアップとかしなけりゃまず大丈夫なんだけど。

その他にもなんとなくGoogleの罠じゃないかとかいろいろ気になって移行に踏み切れないでいる今日この頃。実際に本格的にGAEに移行した人の感想がききたいなあ。

comments powered by Disqus