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

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

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

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

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

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

python code
  1. def _getattr(self, name):
  2.   if name.endswith("_eq"):
  3.     return lambda v: self.filter("%s ="%name[:-3], v)
  4.   raise AttributeError(name)
  5. setattr(db.Query, "__getattr__", _getattr)
  6.  
  7. class 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()
  47.  

これで

python code
  1. class 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.  
  7. Test.find_all() # created_atの降順
  8. Test.all().name_eq("user").update(created_at = datetime.now())
  9. stab = Test.stab() #nameがなくても作成できる
  10.  

こんな感じにかけます。

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

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

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

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

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

Related posts:

07.27.08/12am

2 comments

trackback uri
  • ajax-loading
  • ajax-loading
  • ajax-loading
  1. Takanori Ishikawa 07.01.08/02am website
    >トランザクション
    あー、使ってないわー。記事数もタグも毎回計算 + memcached 任せ。

    > Wordpress
    面倒くさいよね。。こっちも同じ理由 + サーバ邪魔、でタイミングもよかったので GAE に移行しました。

    > 容量
    いい機会なので画像は全部 Flickr にした。

    癖もあるし、管理機能もしょぼいけど、サーバのこと考えなくていいのは、やっぱ楽です。
  2. yuin 07.01.08/03am
    おわ、 ishikawaさん、わざわざありがとうございます。

    >>あー、使ってないわー。記事数もタグも毎回計算 + memcached 任せ。

    トランザクションが使い物にならないとそうなりますよねえ。try exceptで自前トランザクションすれば何とかなるのかなあ・・・

    それよりは記事とかコメントの更新時に全計算してキャッシュしたほうがよさそうだなあ・・・

    >> 面倒くさいよね。。こっちも同じ理由 + サーバ邪魔、でタイミングもよかったので GAE に移行しました。

    めんどくさいですよねえ。うちはそもそもレンタルサーバなんですよね。だから決心がつかないのかも。

    >> 容量
    俺もFlickrにするか、アップローダだけ別サブドメインで立てようかな、とか思っています。

    >> 癖もあるし、管理機能もしょぼいけど、サーバのこと考えなくていいのは、やっぱ楽です。

    やっぱり癖はありますよねえ。でも根っからのPythonistaとしてはPythonで書いたアプリがサクサク動くだけで相当うれしいんですけどね(笑


    わざわざ感想ありがとうございました。

Leave a Comment

You can use these tags: <code>, <i>, <em>, <strong>, <a>

About

Author:yuin(http://inforno.net/)

文学部文化学科卒という生粋の文系趣味プログラマ。

主にRuby、Javascript、PHP、JAVA,Python,C,Scala,Schemeなどを使っています。今はPythonな感じかもしれない。今後作曲活動なども復活するかもしれない。

Pages