1

簡単に言うと、ndb データベースのレコードを更新する AppEngine アプリと通信する Second Life でスクリプトを作成する必要があります。データベースから抽出されたレコードは、バッチ (ページ) として LSL スクリプトに送信されます。LSL スクリプトは顧客を更新し、データベースでこれらの顧客を更新済みとしてマークするよう Web アプリに要求します。

バッチを作成するには、(整数) プロパティでクエリを使用し、次のバッチへのカーソルを生成するためにupdate_ver==0使用します。fetch_page()このカーソルは、urlsafe()エンコードされたパラメーターとして LSL スクリプトにも送信されます。

顧客を更新済みとしてマークするにupdate_verは、 を 2 などの他の値に設定し、エンティティを 経由で更新しput_async()ます。次に、LSL スクリプトは、先に送信されたカーソルのおかげで次のバッチをフェッチします。

私のかなり単純な質問は次のとおりです。Web アプリでは、クエリ プロパティupdate_verがフィルターを満たさなくなったため、カーソルはまだ有効ですか? または、別の戦略を使用する必要がありますか?

無関係な部分 (認証を含む) を取り除くと、現在のコードは次のようになります (Customer はデータベース内のエンティティです)。

class GetCustomers(webapp2.RequestHandler):    # handler that sends batches to the update script in SL
    def get(self):
        cursor=self.request.get("next",default_value=None)
        query=Customer.query(Customer.update_ver==0,ancestor=customerset_key(),projection=[Customer.customer_name,Customer.customer_key]).order(Customer._key)
        if cursor:
            results,cursor,more=query.fetch_page(batchsize,start_cursor=ndb.Cursor(urlsafe=cursor))
        else:
            results,cursor,more=query.fetch_page(batchsize)
        if more:
            self.response.write("more=1\n")
            self.response.write("next={}\n".format(cursor.urlsafe()))
        else:
            self.response.write("more=0\n")
        self.response.write("n={}\n".format(len(results)))
        for c in results:
            self.response.write("c={},{},{}\n".format(c.customer_key,c.customer_name,c.key.urlsafe()))
        self.response.set_status(200)

データベース内の Customer エンティティを更新するハンドラーは次のとおりです。c= パラメータはurlsafe()、更新するレコードのエンコードされたエンティティ キーであり、パラメータはプロパティnv=の新しいバージョン番号です。update_ver

class UpdateCustomer(webapp2.RequestHandler):
    @ndb.toplevel   # don't exit until all async operations are finished
    def post(self):
        updatever=self.request.get("nv")
        customers=self.request.get_all("c")
        for ckey in customers:
            cust=ndb.Key(urlsafe=ckey).get()
            cust.update_ver=nv   # filter in the query used to produce the cursor was using this property!
            cust.update_date=datetime.datetime.utcnow()
            cust.put_async()
    else:
        self.response.set_status(403)

これは期待どおりに機能しますか? 助けてくれてありがとう!

4

1 に答える 1

0

これらのカーソルは効率的であり、前のバッチで何が起こったかに関係なく、意図したとおりに次のバッチを取得できるため、戦略は機能します。

補足として、最適化することもできます。1UpdateCustomerつずつ取得/保存する代わりに、たとえば.ndb.put_multi_async

于 2015-01-03T10:51:44.970 に答える