星期二, 9月 20, 2011

touch data for all kinds

用AppEngine寫程式, 經常會有需要一次update所有的data, 可是如果真的要上傳一個新的version去GAE上執行很麻煩, 而且又因為GAE很容易timeout, 要把一件事分很多段來做, 或是用mapreduce. 總之是很花時間的苦差事. 而且通常這種事只要做一次, 上傳一份特別的code總是很不舒服.

後來在網路上看到了這個作法, 真是相當貼心呀.

首先要先用remote api.

$ python ~/scripts/google_appengine/remote_api_shell.py -s xxxx.appspot.com

輸入帳號跟密碼後, 就會出現標準的python command line


App Engine remote_api shell
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2]
The db, users, urlfetch, and memcache modules are imported.
xxxx>

先執行兩行
xxxx> sys.path.append(os.getcwd())
xxxx> from models import *
最後一行會把這個AP定義好的model都import進來, 如果你們沒有models.py做這件事的話, 就不要學了... :P

然後學到的重點就是可以用下面這一招
>>> len ([e.put() for e in XXXX.all().filter().fetch(1000)])

只要有先定義好的index, filter()裡面的條件可以任意的設定. 把filter()整個拿掉也行. 這樣它會把每一個entity拿出來, 再執行一次put(). 這樣就可以達到更新model的用意, 而且顯然也不受timeout的限制, 十分好用.

沒有留言: