1

ここに私のジレンマがあります。エンティティのリストを調べて、繰り返しプロパティ (私は NDB を使用しています) が空かどうかを確認する必要があります。そうであれば、それに値を割り当ててput(). それ以外の場合、エンティティをスキップします。Google App Engine に付属のリモート ログイン シェルでこれらすべてを実行しようとしています。

Model.query() を反復処理し、条件を実行し、値を書き込もうとしましたが、書き始めるとプロセスがハングアップします。最後に Ctrl-C を押すと、「assert response.set_status_size() == len(server_keys); AssertionError」というエラーが表示されます。これは、取得しようとしているエンティティのサイズと関係があると思います。何が起きているか知っている人はいますか?これが私の現在のコードです:

>>> for entity in Model.query():
...    if not len(entity.references):
...        entity.references = somevalue
...        continue
...    print 'skipped'

ステートメントを使用する代わりにクエリをフィルタリングするだけifですが、繰り返されるプロパティの長さでクエリをフィルタリングする方法がわかりません。

4

3 に答える 3

3

エンティティはいくつありますか? 100 以上ある場合、リモート API からのクエリは非常に非効率的です (2 次)。そのため、ハングすることを説明できます。

あなたが探している条件を検出するクエリを書くことができないのは正しいです。

于 2012-12-17T07:37:04.457 に答える
1

コード サンプルは、参照のない最初のエンティティが見つかったときに返されます (または、skippedそのようなエンティティがない場合は出力されます) が、参照のないエンティティが残る場合があります。それがあなたの意図したものかどうかはわかりません。

['python', 'ruby', 'php'] のように少数の値しか参照できない場合は、 のようなRepeated Propertiesクエリを実行Model.query(Model.references.IN(['python', 'ruby', 'php'])))し、そのリストとすべてのエンティティのリストの差をとって、残りのエンティティを繰り返します。(私は NDB についてよく知らないので、これが一般的には良い方法であるとは思えませんが、一部のデータ セットでは問題なく機能することを期待しています。)

于 2012-12-17T01:08:54.550 に答える
1

私はついにそれを働かせました!以前query.fetch_pageはクエリをバッチでフェッチしてから、各バッチを反復処理して変更を適用していました。

>>> more = True
>>> cursor = None
>>> while more:
...     batch, cursor, more = MyModel.query().fetch_page(50, start_cursor=cursor)
...     for entity in batch:
...          if not len(entity.references):
...               entity.references = somevalue
...               entity.put()
...     print "finished batch"
于 2012-12-17T15:46:15.523 に答える