Google App Engine上で開発し、あなたの経験は何ですか?
-
22-08-2019 - |
質問
GQLは、SQLを知っている誰かのために学ぶのは簡単ですか?ジャンゴ/ Pythonはどうでしょうか? App Engineは本当に簡単なスケーリングがありますか? 「GQL注射」に対する任意の組み込みの保護はありますか?そしてそうで...
私はアプリのエンジンを使用してのそれほど明白ではない浮き沈みを聞いてみたい。
乾杯!
解決
最も明白なとイライラする問題は、「偉大な外観と非常によく考え抜か、あなたがSQLに使用されている場合で動作するように簡単にされ、データストアのAPIですが、すべてのクエリの結果セット全体で千行の制限があり、次のことができますそれを超えトンのアクセス回数またはオフセット。私は実際にそれが1000行を超えたら、モデルのデータを追加したり、アクセスすることができないと、奇妙な問題に遭遇しました。
1000年行制限スタックオーバーフローの説明を参照してください>
この本の本当に良い要約やその他の問題を書きましたは、アプリエンジンがものの処分で持っている本当に素晴らしいツールである、と私は本当にそれで働くのが好き、と述べました。これは、マイクロWebサービス(例:JSONのAPIを)展開するための最適です。他のアプリケーションで使用するために、
他のヒント
Googleのアプリエンジンとの私の経験は素晴らしいされている、との 1000年の結果は限界がある[削除をされている、ここでのリリースノートへのリンクです
これ以上の1000年結果の制限 - それです 右:カーソルを追加したと 多くの小規模の集大成 データストアの安定性とパフォーマンス 過去数ヶ月にわたり改善、 我々は今、除去するのに十分確信しています 最大の結果を完全に制限します。 あなたはフェッチをやっているかどうか、 反復する、またはカーソルを使用して、あります 結果の数に制限
GQLは非常に簡単です - それは声明、何よりも「選択」は、SQLのサブセットです。これは、しかし、低レベルAPIの上にのみコンビニエンス層だし、すべての解析はPythonで行われます。
(彼らはとにかく適切に書かれたGQLでは不可能ですが)その代わり、私は、手続きでクエリAPIを使用することをお勧めします、何の実行時の解析を必要としない、と「GQL注射」の脆弱性は完全に不可能になります。クエリAPIは非常に単純です:Modelクラスに.ALL()を呼び出し、またはdb.Query(モデル名)を呼び出します。クエリオブジェクトは、GQLオブジェクトが(に.get()、.fetch()、.count())を持つすべての設備に加えて、.filter(field_and_operator、値)、.ORDER(field_and_direction)と.ancestor(エンティティ)メソッド有しますなど)クエリの各メソッドは、便宜のために、Queryオブジェクトそのものを返すので、あなたはそれらをチェーンすることができます:
結果= MyModel.all()フィルタ( "FOO ="、5).ORDER( " - バー")。フェッチ(10)
と等価です
= MyModel.gql( "FOO = 5 ORDERバールDESC LIMIT 10 BY")の結果。フェッチ()
のAppEngineでの作業の主な欠点は、すでにコメントで言及された1kのクエリ制限がありました。私が見たものの言及していないことがあるという事実であるビルトインあなたがこの問題を回避することが可能なソート可能順序、。 AppEngineのクックブックから:
def deepFetch(queryGen,key=None,batchSize = 100): """Iterator that yields an entity in batches. Args: queryGen: should return a Query object key: used to .filter() for __key__ batchSize: how many entities to retrieve in one datastore call Retrieved from http://tinyurl.com/d887ll (AppEngine cookbook). """ from google.appengine.ext import db # AppEngine will not fetch more than 1000 results batchSize = min(batchSize,1000) query = None done = False count = 0 if key: key = db.Key(key) while not done: print count query = queryGen() if key: query.filter("__key__ > ",key) results = query.fetch(batchSize) for result in results: count += 1 yield result if batchSize > len(results): done = True else: key = results[-1].key()リモートAPIと一緒に
上記のコード(この記事を参照)ことができますあなたが必要としてあなたができるだけ多くのエンティティを取得します。
あなたはこのように上記のコードを使用することができます:
def allMyModel(): q = MyModel.all() myModels = deepFetch(allMyModel)
まず私はGQLにSQLから移行し他と同じ経験をしました数ヶ月は、私は絶対にApp Engineのが大好きです。私はそれに私の古いプロジェクトのすべてを移植しています。
私はいくつかの高トラフィックのウェブアプリケーションをホストするためにそれを使用する(そのうちの一つは、50Kの分を打つ取得するピーク時に。)
Google App Engineが、実際のデータベースを使用して、明らかに分散ハッシュマップのいくつかの並べ替えを使用していません。これは、単にSQLに慣れている人は、最初に見に行くされていないいくつかの異なる振る舞いに自分自身を貸すだろう。だから、例えば高速動作をすることが期待され、通常のSQL内の項目の数を取得、しかしGQLと、それだけで同じように仕事に行くのではない。
ここではいくつかのより多くの問題があります:
http://blog.burnayev.com/2008/04/gql -limitations.htmlする
私の個人的な経験では、それは調整だが、学習曲線が細かいます。