2011-12-18 6 views
3

さて、私はvideoを見て、App Engineのドキュメント(Using the High Replication Datastoreを含む)の記事を読んでいます。しかし、私はまだ完全にそれの実用的な使用に混乱しています。私はビデオのメリットを理解しています。しかし、私が欠けているのは、実用的な例です。 Web上には多くのマスター/スレーブの例がありますが、高いレプリケーションデータストアを(適切なドキュメントとともに)ほとんど示していません。 Using the High Replication Datastoreの記事で使用されているゲストブックのコード例では、以前のゲストブックのコード例にはない新しい機能を追加して祖先のキーを示しています(ゲストブックを変更できるようです)。これはちょうど混乱に加わります。High Replication Datastoreの使用方法

多くの場合、GAEでdjangoformsを使用しています。誰かがこれらのすべてのクエリを高レプリケーションデータストア互換クエリに変換するのを手伝ってもらえるかどうか疑問に思っていました(すべてのクエリが必ず高いレプリケーションデータストア互換クエリ例そのものに焦点を合わせる)。

UPDATE:レプリケーションデータストアの互換性の高いクエリを使用しています。私は常に最新のデータを返し、失効する可能性のあるデータは返さないクエリを参照します。エンティティグループを使用する方法がここにあるようですが、前述のように、これを行う方法の実用的なコード例はたくさんありませんので、これが私が探しているものです!

だからthe queries in this articleは、次のとおりです。

この記事の主な定期的なクエリは次のとおりです。私たちはに変換されます

query = db.GqlQuery("SELECT * FROM Item ORDER BY name") 

:フォームの検証

query = Item.all().order('name') // datastore request 

は次のように起こります

data = ItemForm(data=self.request.POST) 
if data.is_valid(): 
    # Save the data, and redirect to the view page 
    entity = data.save(commit=False) 
    entity.added_by = users.get_current_user() 
    entity.put() // datastore request 

してフォームを埋めるためのデータストアから最新のエントリを取得は次のように行われます

id = int(self.request.get('id')) 
item = Item.get(db.Key.from_path('Item', id)) // datastore request 
data = ItemForm(data=self.request.POST, instance=item) 

だから私は/私たちは高レプリケーションデータストアとの互換性、これらすべてのデータストア要求を作成するために必要な何をすべきか?

私にはっきりしない最後のものが1つあります。先祖キーを使用すると、データストア内のモデルに影響があります。例えば、彼らが使用するゲストブックのコード例では:

def guestbook_key(guestbook_name=None): 
    return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook') 

しかし「ゲストブック」in the model存在しないので、どのようにあなたは、この上で「db.Key.from_path」を使用することができ、なぜこの仕事がしませんか?これにより、データを取得する際に考慮する必要があるデータストアのデータがどのように格納されるかが変更されますか(たとえば、djangoformを使用するときに除外する必要がある別のフィールドが追加されますか?

私が前に言ったように、これは私をたくさん混乱させ、あなたの助けが大いに評価されました!

+0

HRデータストアをM/Sのように動作させるための魔法のレシピを探しているようです。そこには存在しません - あなたは単に失効したデータの結果がそれぞれのクエリにどのような影響を及ぼすのかを考え、それが問題であれば再構成するだけです。 –

+0

こんにちはニック、私の質問に答える時間をとってくれてありがとう。私はHRがM/Sのように行動するという魔法のレシピを得ようとはしていませんが、私はあなたがそれを考える理由を理解していると思います。私が得ようとしているのは、これらの例を使用して、実際にHR互換のリクエストを書き込むことができるコードスニペットです(メモ:古いデータなし)。過去数年間、私はM/Sと仕事をしていましたが、今はHRと仕事をしたいと思いますが、どのように考えているのかわかりません。実際のコード例では、GAE Webサイトのドキュメントはごくわずかです。私はdjangoformsの例を選択します。これは、これをたくさん使って、新しいコードに集中することができるからです。 – reallife

+0

"メモ:古いデータはありません" - HRをMSに切り替える方法を求めています。 HRで作業するためにクエリを変更する必要はありません。最終的に一貫していることを受け入れるだけで、必要に応じてそのことを考慮に入れます。 –

答えて

3

なぜあなたはクエリを変更する必要があると思うかわかりません。あなたが明示的にリンクしているドキュメント:

バックエンドは変更されますが、データストアAPIはまったく変更されません。使用しているデータストアに関係なく、同じプログラミングインターフェイスを使用します。

エンティティグループを使用しないと、クエリの同期が取れないことがあります。あなたの最終的なコードスニペットはそれの単なる例です。文字列 'Guestbook'はちょうど祖先のキーです。私はそれがモデルに存在する必要があると思う理由を理解していません。ここでもまた、非HRデータストアと同じです。キーはパスから構築されています。パスは任意の文字列で構成できます。おそらく、entity groups and keysの文書を再度読​​む必要があります。

+1

あなたはただそれに私を打つ。ただし、「ゲストブック」は先祖のキーではありません。これはキーの種類です(http://code.google.com/appengine/docs/python/datastore/keyclass.html#Key_from_path)。 –

+0

こんにちは、私の質問に答える時間を取ってくれてありがとう。ほんとうにありがとう。唯一のことは、高レプリケーションデータストアでうまく動作するように上で述べたこれらのクエリを書き直す方法を知りたいということです(これは十分にはっきりしないのは申し訳ありませんが、これは私が最新のデータにアクセスし、 。実際にリンクしたドキュメントを5回以上読み返しても、コードを書き直す方法はまだありません。私は、なぜそれを使用する理由と古いデータと最新のデータとを理解する(その一部)の理論を理解していると思いますが、実際のコードでこれを達成する方法はありません。 – reallife

+0

全体的なポイントは次のとおりです。コードを書き直す必要はありません。 –

1

HRDを使用するための変更は、クエリの作成方法ではなく、返されるデータについて何が保証されているかにあります。あなたが与える例:

query = db.GqlQuery("SELECT * FROM Item ORDER BY name") 

もHRDで動作します。キャッチ(基本的に)は、この種のクエリ(この構文またはItem.all()フォームのいずれかを使用)が、オブジェクトをわずかに古く返すことができることです。これはおそらくゲストブックの大きな問題ではありません。

オブジェクトをキーで直接取得する場合、オブジェクトが期限切れになることはありません。この問題を見ることができるのはクエリのみです。整合性が必要なすべてのエンティティをsingle entity groupに配置することで、クエリでこの問題を回避できます。これにより、エンティティグループに書き込むことのできる速度が制限されることに注意してください。

フォローアップの質問に答えて、「ゲストブック」はエンティティの名前です。

+0

また、私の質問にお答えすることに感謝します!私はとても感謝しています。ダニエルの答えに私がちょうどコメントしたことのほとんどはあなたの答えにも当てはまります。私はまだ私の質問に記載されているクエリを最新のデータを取得するデータストアの要求に翻訳したいと思います(これがゲストブックの場合に必要かどうか忘れてしまいます)。 ---「あなたはキーで直接オブジェクトを取得する」と「一貫性が必要なすべてのエンティティを単一のエンティティグループに配置することでクエリでこの問題を回避できます」 - >どうやってコードサンプルをお願いしますか? – reallife