簡単に言うと、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)
これは期待どおりに機能しますか? 助けてくれてありがとう!