私は困惑しています。
今日、本番用の appengine アプリにあるはずだと思っていた一部のデータが表示されていないことに気付きました。リモート コンソール経由でアプリに接続し、クエリを手動で実行しました。案の定、私が期待していた 101 行のうち 15 行しかないように見えました。
次に、appengine.google.com の管理コンソールにアクセスし、次のクエリでデータストア ビューアーを起動しました。
SELECT * FROM Assignment where game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')
表示される結果は、20 件の結果の最初のページです。これらの結果をページで確認すると、101 個のエンティティすべてを確認できます。万歳!私のデータはまだそこにあります。しかし、なぜdb api経由でアクセスできないのですか? (注:このクエリは手動でmemcachedされていませんが、memcacheビューアを介してmemcacheをクリアしようとしました)
リモート コンソールから:
> from google.appengine.ext.db import GqlQuery
> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')").count()
15
リモート コンソールはアプリ自体と一致しており、予想される 101 行のうち 15 行しか表示できないようです。
何を与える?
更新:
これはインデックス作成の問題であると思われます。欠落している行の 1 つに対して get_by_key_name を発行すると、その後、db api クエリに表示されます。
> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')").count()
15
> entities.Assignment.get_by_key_name('201212-assignment-135.9')
<entities.Assignment object at 0xa11eb6c>
> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb')").count()
16
この問題を解決するには、インデックスを再構築する必要がありますか (または再構築できますか)。
更新#2:
このクエリの完全なインデックスを構築しようとしましたが、クエリが構築されたばかりのインデックスを (query.index_list() を介して) 使用する場合でも、結果は依然として、介して利用可能なアイテムの小さなサブセットに限定されることを確認しました。データストア ビューア。腹立たしいことに、これは実際には、以前のインデックスで使用できるものとは異なるサブセットです (20 項目対 15 項目)。したがって、フィルター条件を追加すると、さらに 5 行が返されます。とても愚かです。
すべてのインデックスは「サービスを提供している」と主張しているため、インデックスがこれほど離れている理由はありません。
更新#3:
場合によっては、新しいインデックスを使用すると、正しい答えが得られます。
> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb') and user = 'zee'").count()
101
ただし、このクエリを 10 回発行すると、約半分の時間で「悪い」結果が返されます。
> GqlQuery("SELECT * FROM Assignment WHERE game = KEY('Game', '201212-foo') and player = KEY('Player', 'player-mb') and user = 'zee'").count()
16
おそらく、私が半分の時間でヒットしている悪い/遅れている bigtable レプリカの問題か、または回答が得られない他の完全に不透明な何か (appengineのステータスには、今日のサービス中断がリストされています) がありますが、これは自分で修正されると感じています。あればまた更新します。
最終更新:
お察しのとおり、今朝目が覚めたとき、アプリ (および手動クエリ) は、データの一貫した正しいビューを表示するようになりました。なぜこれが起こったのかについての答えが欲しいのですが、私がそれを得るまで、私はそれを内部のGoogleビッグテーブルの奇妙さにチョークするつもりです.
この問題を appengine に対して提出し、詳しい人から回答を得られるかどうかを確認しました。