読者です 読者をやめる 読者になる 読者になる

When it’s ready.

出来るまで出来ない

GoogleAppEngineでremote_apiを使う s_thx>tmatsuo

GogoleAppEngineで、日本語検索作ってたら、転置インデックスの作り方ミスった。簡単に直ったんだけど既にappspot.comで作成された転置インデックスが邪魔なので一気に消したいが、デフォルトのDashBordでは一気に消せるインターフェースが用意されていない。20個ずつポチポチ手で消していたら、寝ようとしていたtmatsu様が救いの手を差しのべてくれた。

「remote api あるお>http://code.google.com/intl/en/appengine/articles/remote_api.html

それから色々やって、結局の所動いた。
ローカルのshから、直接Googleのサーバーのデータをいじれる。
実際に操作した物を貼ってみる。

% python appengine_cosole.py a2c-dev
App Engine interactive console for a2c-dev
>>> import ngram
>>> import ngram.main
>>> from google.appengine.ext import db
>>> ent = ngram.main.Feed.all()
>>> ent.count()
Username:hogehoge@gmail.com
Password:
0L
>>> ent = ngram.main.InverseIndex.all()
>>> ent.count()
666L
>>> db.delete(ent)
>>> ent.count()
646L
>>> for i in ent:
...   i.delete()
... 
>>> ent.count()
626L
>>> entities = ent.fetch(400)
>>> db.delete(entities)
>>> entities = ent.fetch(400)
>>> db.delete(entities)
>>> ent = ngram.main.InverseIndex.all()
>>> ent.count()
0L
>>> 

500個以上のデータを一気に操作することが出来ないらしいので、400個ずつ消してみた。はじめは666個も有ったのに、たった2回の操作で全部消せた。毎回同じ事するならコードに書いても良いけど、たまにするくらいならこっちの方が全然いい。

以下手順。
app.yamlに リモートアクセス用のurlを追加する。

- url: /remote_api
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
  login: admin

appの中にPythonスクリプトを用意する。

#!/usr/bin/env python
# coding:utf-8

import code
import getpass
import sys
import os

# g_pathは適宜ご自分の環境に書き換えてください
g_path = "/Applications/MyApp/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine"
extra_path = [
  g_path,
  os.path.join(g_path, 'lib', 'antlr3'),
  os.path.join(g_path, 'lib', 'webob'),
  os.path.join(g_path, 'lib', 'django'),
  os.path.join(g_path, 'lib', 'yaml', 'lib')
]
sys.path = extra_path + sys.path


from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.ext import db

def auth_func():
  return raw_input('Username:'), getpass.getpass('Password:')

if len(sys.argv) < 2:
  print "Usage: %s app_id [host]" % (sys.argv[0],)
app_id = sys.argv[1]
if len(sys.argv) > 2:
  host = sys.argv[2]
else:
  host = '%s.appspot.com' % app_id

remote_api_stub.ConfigureRemoteDatastore(app_id, '/remote_api', auth_func, host)

code.interact('App Engine interactive console for %s' % (app_id,), None, locals())

このファイルが、Googleの解説ページのやつのままだと動かなくて、tmatsuo氏に教えて貰った。9行目のg_pathには、appengineのインストールされているところを差し替えてくらさい。

あとは、deployして準備OK

python2.5 appengine_cosole.py yourApp-ID

と言う風に、起動する。あとは、自分のアプリを適当にぽこりんこImport すればOK