5

以下にモデルがあり、すべての個別の値を取得したいと思いareaます。SQLに相当するものはselect distinct area from tutorials

class Tutorials(db.Model):  
    path = db.StringProperty()
    area = db.StringProperty()
    sub_area = db.StringProperty()
    title = db.StringProperty()
    content = db.BlobProperty()
    rating = db.RatingProperty()
    publishedDate = db.DateTimeProperty()
    published = db.BooleanProperty()

私はPythonで私ができることを知っています

    a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com']
 b = set(a)
    b
    >>> set(['livejournal.com', 'google.com', 'stackoverflow.com'])

ただし、エリアアイテムをクエリから別のリストに移動してから、リストに対してセットを実行する必要があります(非常に非効率的に聞こえます)。データストアの位置1001にある個別のアイテムがある場合は、次の理由で表示されません。 1000のフェッチ制限。

データストア内のareaのすべての個別の値を取得して、リンクとして画面にダンプしたいと思います。

4

3 に答える 3

7

データストアは、単一のクエリでこれを行うことはできません。データストアリクエストは常にインデックスからの結果の連続ブロックを返し、インデックスは常に指定されたタイプのすべてのエンティティで構成され、指定された順序に従って並べ替えられます。1つのフィールドの値が重複しているという理由だけで、クエリがアイテムをスキップする方法はありません。

1つのオプションは、データを再構築することです。たとえば、「エリア」を表す新しいエンティティタイプを導入します。チュートリアルを追加するときに、対応する「エリア」がまだ存在しない場合は作成し、チュートリアルを削除するときに、同じ「エリア」を持つチュートリアルが残っていない場合は、対応する「エリア」を削除します。各エリアにそのエリアのチュートリアルの数が保存されている場合、これはそれほど面倒ではないかもしれません(ただし、トランザクションなどとの一貫性を保つことは実際にはかなり面倒です)。エンティティのキ​​ーはエリア文字列自体に基づいている可能性があります。つまり、エリアエンティティを取得するためのクエリではなく、常にキールックアップを実行できます。

もう1つのオプションは、キューに入れられたタスクまたはcronジョブを使用して、すべての領域のリストを定期的に作成し、必要に応じて複数のリクエストに累積して、結果をデータストアまたはmemcacheに配置することです。それはもちろん、エリアのリストが一時的に古くなっている可能性があることを意味します(または、絶え間ない変更がある場合は、完全に古くなることはありません)。これは、受け入れられる場合と受け入れられない場合があります。

最後に、チュートリアルと比較して領域が非常に少ない可能性がある場合は、最初のチュートリアル(領域でソート)を要求し、次に最初の領域よりも領域が大きい最初のチュートリアルを要求することで、その場でそれを行うことができます。すぐ。ただし、これには個別の領域ごとに1つのリクエストが必要であるため、高速になる可能性は低くなります。

于 2009-07-25T21:42:23.390 に答える
1

DISTINCT キーワードは、リリース 1.7.4 で導入されました。

于 2013-06-04T23:38:41.120 に答える
0

これは以前に尋ねられたものであり、結論として、セットを使用することは問題ありません。

于 2009-07-25T21:41:14.657 に答える