0

ユーザーが任意のパス(ウィキなど)に投稿を追加/編集できるGAEのアプリがあります。すべての投稿を1つのテーブルに保存しています。テーブルは次のように構成されています。

class WikiPosts(db.Model):
    path = db.StringProperty(required = True)
    content = db.TextProperty(required = True)
    date_created = db.DateTimeProperty(auto_now_add = True)

ホームページに、各パスの最新の投稿を表示したいと思います。

私の質問はこれに似ていますが(各GROUP BYグループの最初の行を選択しますか?)、答えはGAEでは不可能な結合の使用を含みます。

各URLの最新の投稿を追跡するための専用フィールドを持つことができますが、gqlクエリを使用してそれを行うことは可能ですか?

現在、私はこのクエリを使用しています。このクエリは、作成時間でソートされたすべてのwiki投稿のすべてのバージョンを返します。

db.GqlQuery("SELECT * FROM WikiPosts ORDER BY date_created DESC limit=10")
4

3 に答える 3

1

パスの一意のリストがなく、GAEはSQLと同等のものをサポートしていないためSELECT DISTINCTここここ、およびここを参照)、次のことを行う必要があります。

  1. ホームページが表示されるたびにそのリストを生成する(数百の投稿を超えた場合はお勧めしません)、または
  2. 別のテーブル/モデルを作成して、新しい投稿が追加されたときに一意のパスを追跡する(次に、この新しいテーブルをShayの回答と組み合わせて使用​​する)、または
  3. あなたが述べたように、パスごとに最新の投稿を追跡します。

オプション3が最善の策だと思います。なぜなら(GAEの場合によくあることですが)、データストアに取得したいものを正確に入力するからです(つまり、書き込みをより複雑にして、クイック読み取りを優先します)。

于 2012-07-31T15:11:51.900 に答える
0

あなたは呼び出すことができます:

def get_latest_posts(amount=10):
  return db.GqlQuery("SELECT * FROM WikiPosts where path =:1 ORDER BY date_created DESC limit=:2", path, amount)

これにより、パスごとに最新の投稿が返されます。

于 2012-07-30T18:26:28.617 に答える
0

ページにアクセスするたびにクエリを実行することに関連する問題はたくさんあります。確かに、インスタンスの数が多い可能性があり、クエリをサポートするインデックスの結果整合性と競合する必要があります。あなたのページはトップ10のリストにすぎないので、memcacheオブジェクトで単純に管理してみませんか?オブジェクトが見つからない場合は、クエリを実行して、欠落しているmemcacheオブジェクトを記述します。リストの更新を投稿すると、エンティティput()の前にmemcacheが書き込まれるか、書き換えられます。これは、遅延関数(タスクキュー)の候補として適している可能性があります。

于 2012-08-03T04:01:08.403 に答える