2009-04-06 25 views
0

特定のタイプの日付範囲内の一部の値を検索しようとしていますが、データベースに存在する日付のコンテンツがクエリによって返されません。ここでGoogle AppEngine:日付範囲が正しい結果を返さない

は、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

私はインデックスを削除し、運がないと再作成しようとしました。

ありがとうございました

答えて

1

私には何も見えません。欠落している日付にもmytype ==型があることを確認していますか?

過去にインデックスで面白い動作が見られました。すべてのレコードを反復処理し、データベースに戻すハンドラを作成することをお勧めします。一括アップローダで何かが正しく動作していない可能性があります。ここで

は、私はモデルクラス内のすべてのエンティティを反復処理するために使用するハンドラのタイプです:

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を使用していましたが、何十万というリクエストをするときには豚だったことがわかりました。私はこの1つのような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 

ベン

UPDATE:今リモートAPIが動作し、信頼性の高いされていることを、私はめったにもうハンドラのこのタイプを書きません。同じアイデアがリモートAPIコンソールのエンティティを反復処理するために使用するコードにも当てはまります。

+0

はい、既存のデータはクエリ内のデータと同じ型です。私は結果をログに印刷している間にテストしましたが、それは正しいです。 –

+0

私はより多くの情報で質問を更新しました。 –

+0

素晴らしいスクリプト、私は今夜それを試してみましょう。あなたは、jsonからnew_last_key_strを取得し、それをURLに戻して更新するHTMLを持っていますか? –

関連する問題