1

わかりましたので、ローカルとgaeクラウドに同じpythonコードがあります。

エンティティをローカルに保存すると、set 要素タイプ datetime.datetime の ListProperty フィールドは Datastore Viewer で次のように表示されます。

2009-01-01 00:00:00,2010-03-10 00:00:00

同じものをクラウドに保存すると、ビューアに次のように表示されます。

[datetime.datetime(2009, 1, 1, 0, 0), datetime.datetime(2010, 3, 9, 0, 0)]

なぜ異なる表現ですか?

これは気になりません.クラウド上でこのフィールドを照会した場合にのみ、クエリは一致するエンティティを見つけることができません. 繰り返しますが、コードは同じです。

これが起こっている理由と解決策を考えている人はいますか?

更新:私のクエリは次のとおりです(フィルターを使用):

from x import y
from datetime import datetime
from google.appengine.ext import db

q = y.EntityType.all().filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now())

usersResult = q.fetch(100)
print `len(usersResult)`

結果は 1 である必要があり、代わりに 0 です。

実際には、指定された値 datetime.datetime を持つ ListProperty だけが問題です。StringListProperty に対するクエリは、クラウド上で期待どおりに機能しています。

ローカルとクラウドの両方で対話型コンソールを介して raw フィルターを試しましたが、クラウドでは結果が得られません。したがって、それはデータストアの問題です。ストレージ形式と関係があるに違いないと思います.ListPropertyが次のように見える両方のデータストアにエンティティ値が1つしかありません。

2009-01-01 00:00:00,2010-03-09 00:00:00
[datetime.datetime(2009, 1, 1, 0, 0), datetime.datetime(2010, 3, 9, 0, 0)]

それぞれローカルとクラウドで。

何か案は?

更なるアップデート

datetime.now() をハードコードされた datetime obj に置き換えました - サンプル フィルターは次のようになります。

y.EntityType.all().filter('displayDateRange <=',datetime(2009,11,24)).filter('displayDateRange >=',datetime(2009,11,24))

上記の datetime ListProperty の範囲が 1.1.2009 から 3.9.2010 の場合、これは上記のエンティティを返す必要があることに注意してください。ローカルホスト開発サーバーでこの同一のフィルターを試したところ、そうでした。クラウドは、datetime.datetime ListProperty の表現が異なりますが、そうではありません。

これは、日付範囲でフィルタリングするための現在のベスト プラクティスから取られていることに注意してください。

何が間違っている可能性がありますか?

4

2 に答える 2

2

簡単に言うと、これは現在、アプリ エンジン開発サーバー バージョンのバグとして分類されており、運用クラウド データストアではサポートされていません。

ブログ投稿に詳細な説明を記入し、ポイント 3 を確認してください。

于 2009-11-28T18:41:49.830 に答える
1

表示される問題は、データの表現 (repr) がクラウドに表示される一方で、ローカル ケースでの文字列への変換 ( __str__orの呼び出し) であることは明らかです。__unicode__ただし、この結果の出力の違いが、クラウドでのクエリの失敗の原因になることはありません。

正確なクエリは何ですか?

クエリを知った後の更新:

これらのフィルター条件を使用する理由がよくわかりません。

.filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now())

これには 2 つの問題があります。

  • 2 回呼び出すとdatetime.now()、異なる結果が得られ、結果セットが空になります。これは、同時にアクティブな実行の複数のスレッド/プロセスを持つロードされたサーバーで特に当てはまります。

  • 上記のフィルターのペアで意図したことは、等価性をチェックすることです。datetime.now()ただし、返される日時インスタンスの精度と、データベースに格納されている日時の精度が異なる場合は機能しません。一般に、浮動小数点数とサブ秒精度の時間値の場合に等しいかどうかをチェックすることはお勧めできません。

このようなフィルター条件のペアで何を達成したいですか?

于 2009-11-23T03:32:16.263 に答える