1
        votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')

    for voter in votergroup:
        voter.email = 'testemail@testemail.com'
    db.put(votergroup)

上記のコードは、appengine のドキュメントに示されているように、レコードを更新していないようです。また、クエリ オブジェクトを使用してみましたが、役に立ちませんでした。デバッグ時にオブジェクトをカウントしたところ、10 件のレコードが表示されたので、votergroup がレコードをプルしていることはわかっています。実際、db.put の前に、voter.email をループしたところ、変数が設定されたようです。ただし、変更がデータベースに戻ることはないようです。

私が間違っているかもしれないことを誰かが知っていますか?

4

2 に答える 2

3

エンティティのリストを返すには、fetch()作成したクエリを呼び出す必要があります。その後、それらすべてを永続化するためdb.Query()に呼び出すことができます。put(list_of_entities)それは次のようになります。

voters = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE').fetch(10)

for voter in voters:
    voter.email = 'testemail@testemail.com'
db.put(voters)

クエリを呼び出さない場合fetch()でも、結果を反復処理することができ、必要に応じて小さなバッチを取得するためにデータストア RPC が作成されます。クエリを呼び出しput()ても何も実行されませんが、ループ内の各エンティティに対してアクションを実行できます。

voters_query = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')

for voter in voters_query:
    voter.email = 'testemail@testemail.com'
    voter.put()

これにより、エンティティごとに 1 つのデータストア呼び出しが行われ、反復処理されるバッチごとに 1 つの呼び出しが行われることに注意してください。fetch()返品されるアイテムの数がわからない場合を除き、使用する方がはるかに優れています。

カーソルを使用して、フェッチをより大きなチャンクに分割できます。証拠は見つかりませんがfetch()、1000エンティティの制限があると思います。

于 2010-08-24T04:10:11.270 に答える
1

代わりにこれを試してください:

votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')

for voter in votergroup:
    voter.email = 'testemail@testemail.com'
    voter.put()

アプリ エンジンで一括編集する方法はないと思います。

于 2010-08-24T04:02:32.647 に答える