1

これはとても奇妙です...

まず、このクエリはデータストア ビューアーで機能します。正しい行を返します。

SELECT * FROM Level where short_id = 'Ec71eN'

しかし、これを実行すると

Level.all().filter("short_id = ", 'Ec71eN').get()

これを実行すると、Noneが返されます。

db.GqlQuery("SELECT * FROM Level where short_id = '%s'" % 'Ec71eN').get()

また、 Noneを返します。これを実行すると:

level = Level.get_by_id(189009)

正しい行を返します(189009は正しい行のIDです)

不可解?ここで何が問題なのですか?私はこれまでにこのようなものを見たことがありません.本番環境では少なくとも数週間は正しく機能していました...今日から機能しないケースが少なくとも2つあると思います.


更新:上記を試したときに行が7時間経過していたため、これは最終的に一貫した問題になることはありません。同じ症状の列が 2 列ありました。不思議なことに、同じユーザーによってブースが生成されました。次のような特別なケースのコードをアップロードして、ID を手動で修正した後、ブースは「修正」されました。

if short_id==CASE_1_SHORT_ID: 
     level = Level.get_by_id(CASE_1_ID)

その後、クエリは通常どおり機能しました。

4

2 に答える 2

4

HRDを利用していますか?何も間違っていない。最終的に一貫性があるはずですよね?

クエリ操作は結果整合性があります。Get-by-id 操作は完全に一貫しています。

あなたが説明するのは、正しいデータストアの動作です。データストア ビューア操作が正しい結果を返すのは少し奇妙ですが、データストア操作で別のタブレットにヒットした可能性があります。

于 2013-03-06T19:15:36.103 に答える
1

7 時間前に作成されたことを考えると、「結果整合性」には通常、数秒から数分かかります。結果整合性が問題である場合は、同じクエリ メソッドを何度も実行して、同じ結果が返されるかどうかを確認します。同じメソッドで同じ結果が継続的に返される場合は、結果整合性の問題ではない可能性が高くなります。データのクエリも同様に NDB API に切り替える必要があります。これは 1000 倍優れており、Guido が取り組んでいるので、NDB API が優れていることがわかります。NDB は同じ矛盾を示しますか?

于 2013-03-07T13:16:25.807 に答える