2

entity.put() を介してデータストアにデータを配置し、その後すぐに .get() を介してデータストアから読み取ります (ちょうど配置されたエンティティを含むデータを取得します)。

.get() データは正しいですが、多くの場合、その順序が意味をなさない:

SELECT * FROM entityName
WHERE someThing = 'value'
ORDER BY votes DESC, lastTouchedTimestamp DESC

正しいエンティティ (前述の .put() からの新しいデータを含むように更新) を返しますが、順序が正しくありません (つまり、投票および/または lastTouchedTimestamp が実際には順序どおりではありません)。

GAE はかなり新しいので、見落としている簡単なことがあれば申し訳ありません。

編集/追加:

各エンティティには投票整数があります。SELECT は、10,8,7,7,1 のような投票順にエンティティを返す必要がありますが、代わりに、たとえば 10,7,8,7,1 を返すことがあります。

4

2 に答える 2

6

あなたが説明しているのは、 App Engine 用語では .get() 呼び出しではなくqueryです。適切な .get() 呼び出しはキーを指定し、この競合の影響を受けません。(祖先クエリもそうではありません。) このトピックの背景情報については、https://developers.google.com/appengine/docs/python/datastore/overview#Datastore_Writes_and_Data_Visibilityを参照してください。

クエリ結果で更新されたエンティティを取得しているのは幸運です。これは、 .put() 呼び出しの前に存在していたエンティティがまだクエリと一致していたためです。クエリ結果 (@tesdal が言及した射影クエリを除く) はキーによってアクセスされるため、エンティティで正しい値を取得しています。ただし、順序はインデックスから取得されるため、順序が間違っています。

于 2012-06-17T15:58:46.670 に答える
4

App Engine は、インデックスの更新タイミングに関する保証はありません。

あなたの例では、インデックス データが 10,7,7,7,1 であることを意味しますが、返される結果は実際のオブジェクト (更新される) であるため、エントリの 1 つに 8 が予想されるため、順序付けがオフになっていることに気付きます。

射影クエリを使用すると、10,7,7,7,1 が表示されます。

于 2012-06-16T22:12:49.640 に答える