1

読み取りを高速化するために、memcache にクエリをキャッシュしたいと考えています。このために、クエリの ID を作成する関数が必要です。

class DeleteMe(db.Model)
    pass

query = DeleteMe.all()

# how to get query string/hash form query?
# how to get kind name from query?

私はこのようなことをしたいです(getQueryKeyは、同じクエリに対して常に同じ値を与える関数です):

memcache.set(getQueryKey(query), list(query))

dbまたはndbにすることができます。

4

3 に答える 3

4

同様の問題がありました。ここに私のコードがあります:

    def keyFromQuery( query ):
            """
                    Derives a unique Key from a given query.
                    This Key is stable regardless in which order the filter have been applied
                    @param query: Query to derive key from
                    @type query: DB.Query
                    @returns: string
            """
            origFilter = [ (x, y) for x, y in query._get_query().items() ]
            for k, v in query._Query__orderings:
                    origFilter.append( ("__%s ="%k, v) )
            origFilter.append( ("____kind", query._model_class().kind() ) )
            origFilter.sort( key=lambda x: x[0] )
            filterKey = "".join( ["%s%s" % (x, y) for x, y in origFilter ] )
            return( sha256( filterKey ).hexdigest() )
于 2013-06-01T21:50:19.497 に答える
1

これは本当に意味がありません。クエリは、キャッシュする価値のあるものではありません。これは、1 行のコードで簡単に再作成できる状態のないオブジェクトにすぎません。キャッシュは、データストアからフェッチするのにコストがかかる実際のデータ用です。

一連のクエリを簡単に参照する必要がある場合のより良い解決策は、それらをモジュール レベルで、または関連するモデルのクラス属性として、単に辞書に格納することです。

于 2013-06-01T19:47:34.593 に答える