1

Google App Engine の NDB データストアの非同期 API で使用するために作成したいくつかのタスクレットで何が起こっているのか理解するのに少し苦労しています。概要は次のとおりです。ユーザーの購入履歴をまとめる必要があり、「UserPurchase」オブジェクトは、購入された「製品」または「カスタム」アイテムと、購入された「施設」を参照します。どちらも KeyProperty を使用します。 UserPurchase ndb.Model のプロパティ。さまざまな NDB ルックアップを可能な限り並列化したいので、NDB のドキュメント ( https://cloud.google.com/appengine/docs/standard/python/ndb/async ) にかなり近づけてビルドしました3 つのタスクレット:

@ndb.tasklet
def get_establishment(purch):
    resto = yield purch.p_establishment.get_async()
    ret = {
        "rkey": resto.key.urlsafe(),
        "rname": resto.resto_name
    }
    raise ndb.Return(ret)

@ndb.tasklet
def get_item(purch):
    item = yield purch.p_item.get_async()
    if (purch.p_item.kind() == "Product"):
        ret = {
            "ikey": item.key.urlsafe(),
            "iname": item.name
        }
    else:
        ret = {
            "ikey": item.key.urlsafe(),
            "iname": item.cust_name
        }
    raise ndb.Return(ret)

@ndb.tasklet
def load_history(purch):
    at, item = yield get_establishment(purch), get_item(purch)
    ret = {
        "date": purch.p_datetime,
        "at_key": at.rkey,
        "at": at.rname,
        "item_key": item.ikey,
        "item": item.iname,
        "qty": purch.p_quantity,
        "type": purch.p_type
    }
    raise ndb.Return(ret)

次に、次のように呼び出します。

pq = UserPurchase.query().order(-UserPurchase.p_datetime)
phistory = pq.map(load_history, limit = 20)

最近の 20 件の購入を取得して表示します。しかし、それを実行すると、どうすればいいのかわからないという奇妙な例外が発生します...そして、タスクレットとそれらがどのように機能するかについて、何が起こっているのかを知っていると自信を持って言えるほど詳しくありません。何を探すべきかについて誰かが私にいくつかの指針を与えることができれば、本当に感謝しています...!上記のコードを実行したときに発生する例外は次のとおりです。

      ...
       File "/Programming/VirtualCellar/server/virtsom.py", line 2348, in get
        phistory = pq.map(load_history, limit = 20)
      File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/utils.py", line 160, in positional_wrapper
        return wrapped(*args, **kwds)
      File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/query.py", line 1190, in map
        **q_options).get_result()
      File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 383, in get_result
        self.check_success()
      File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 624, in _finish
        result = [r.get_result() for r in self._results]
      File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 383, in get_result
        self.check_success()
      File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py", line 430, in _help_tasklet_along
        value = gen.send(val)
      File "/Programming/VirtualCellar/server/virtsom.py", line 2274, in load_history
        "at_key": at.rkey,
    AttributeError: 'dict' object has no attribute 'rkey'

エラーに基づいて、タスクレットは辞書を返すのが好きではないようです...

4

1 に答える 1