0

特定のタイプの日付範囲内でいくつかの値を検索しようとしていますが、データベースに存在する日付のコンテンツがクエリによって返されません。

以下は Python コードの抜粋です。

deltaDays = timedelta(days= 20)
endDate = datetime.date.today()
startDate = endDate - deltaDays

result = db.GqlQuery(
   "SELECT * FROM myData WHERE mytype = :1 AND pubdate >= :2 and pubdate <= :3", type, startDate, endDate
  )

class myData(db.Model):
   mytype = db.StringProperty(required=True)
   value =  db.FloatProperty(required=True)
   pubdate = db.DateTimeProperty(required=True)

GQL はデータを返しますが、期待しているいくつかの行が欠落しています。

 2009-03-18 00:00:00
(missing date in results: 2009-03-20 data exists in database)
 2009-03-23 00:00:00
 2009-03-24 00:00:00
 2009-03-25 00:00:00
 2009-03-26 00:00:00
(missing date in results: 2009-03-27 data exists in database)
 2009-03-30 00:00:00
(missing date in results: 2009-03-31. data exists in database)
 2009-04-01 00:00:00
 2009-04-02 00:00:00
 2009-04-03 00:00:00
 2009-04-06 00:00:00

バルクロード スクリプトを使用してデータをアップロードしました。インデックスが壊れているか、それに似たものだと思います。この同じクエリは、私が持っていた別のテーブルで機能していました。しかし、別のソースからの新しいコンテンツに置き換える必要があり、この新しいコンテンツは同じようにクエリに応答しません。それが違いを生む場合、テーブルには約700.000行があります。

さらに調査を行ったところ、appEngine DataStore のバグのようです。バグの詳細については、次のリンクを確認してください: http://code.google.com/p/googleappengine/issues/detail?id=901

インデックスを削除して再作成しようとしましたが、うまくいきませんでした。

ありがとう

4

1 に答える 1

1

私には何も問題がないように見えます。欠落している日付にも mytype == タイプがあると確信していますか?

私は過去にインデックスでいくつかの奇妙な動作を観察しました。すべてのレコードを反復処理し、データベースに put() で戻すハンドラーを作成することをお勧めします。一括アップローダーの何かが正しく機能していない可能性があります。

モデル クラス内のすべてのエンティティを反復処理するために使用するハンドラーのタイプを次に示します。

 class PPIterator(BaseRequestHandler):
  def get(self):
    query = Model.gql('ORDER BY __key__')
    last_key_str = self.request.get('last')
    if last_key_str:
      last_key = db.Key(last_key_str)
      query = Model.gql('WHERE __key__ > :1 ORDER BY __key__', last_key)
    entities = query.fetch(11)
    new_last_key_str = None
    if len(entities) == 11:
      new_last_key_str = str(entities[9].key())
    for e in entities:
      e.put()
    if new_last_key_str:
      self.response.out.write(json.write(new_last_key_str))
    else:
      self.response.out.write(json.write('done'))

エンティティを反復処理するために必要なものは何でも使用できます。以前はブラウザ ウィンドウで Javascript を使用していましたが、何十万ものリクエストを行うと、それは豚のようでした。最近では、次のような Ruby スクリプトを使用する方が便利だと感じています。

require 'net/http'
require 'json'
last=nil
while last != 'done'
  url = 'your_url'
  path = '/your_path'
  path += "?/last=#{last}" if last
  last = Net::HTTP.get(url,path)
  puts last
end

ベン

更新: リモート API が機能し、信頼できるようになったので、このタイプのハンドラーを作成することはほとんどなくなりました。リモート API コンソールでエンティティを反復処理するために使用するコードにも同じ考え方が適用されます。

于 2009-04-06T21:46:37.570 に答える