私は gae と ndb を使用して開発していますが、ndb の取得とクエリのために多くのコードを書かなければならないことがわかりました。場合によっては 2 つのバージョン (場合によっては 3 つ以上) が必要になります。
次のモデルとその中に関数があるとします。
class MainEnt(ndb.Model):
"""Main entity. The parent is the user_key"""
name = ndb.StringProperty()
child = ndb.KeyProperty()
def get_created_by(self, user_id):
"""Get the MainEnt's created by user_id"""
# stuff... getting the query and returning the results
def get_created_by_async(self, user_id):
"""Get async the MainEnt's created by user_id"""
# stuff... getting the query async and returning a future
@ndb.tasklet
def get_childs_async_tasklet(self, mainent_key):
"""Get async the childs of a MainEnt"""
# stuff... yielding the query async. and raise ndb.Return()...
@ndb.tasklet
def get_created_by_async_tasklet(self, user_id):
"""Get async the MainEnt's created by user_id"""
# stuff... yielding the query async. and raise ndb.Return()...
@ndb.tasklet
def get_created_by_async_tasklet_with_childs(self, user_id):
"""Get async the MainEnt's created by user_id and its childs"""
# stuff... yielding the query async. calling get_childs.. and raise ndb.Return()...
@ndb.tasklet
def get_voted_by_async_tasklet(self, user_id):
"""Get async the MainEnt's voted by user_id"""
# stuff... yielding the query async raise ndb.Return()...
@ndb.tasklet
def get_voted_by_async_tasklet_with_childs(self, user_id):
"""Get async the MainEnt's voted by user_id and it's childs"""
# stuff... yielding the query async, calling get_childs.. and raise ndb.Return()...
@ndb.tasklet
def get_created_and_voted_by_async_tasklet(self, user_id):
"""yield get_created_by_async_tasklet and get_voted_by_async_tasklet in parallel"""
# stuff... yielding the other two functions and return results...
class ChildEnt(ndb.Model):
name = ndb.StringProperty()
ご覧のとおり、MainEnt には「同じ」(場合によってはそれ以上の) 結果を返す 3 つのメソッドがありますが、異なるコンテキストで使用されます。
1)同期機能は、結果を取得する必要がある場合にのみ使用され、その結果を取得することが唯一の「ndb操作」です。
2) 非同期関数は、結果を取得する必要がある場合にのみ使用されますが、重複させたい他の ndb クエリも実行します。
3)タスクレット非同期関数は、結果を取得する必要がある場合にのみ使用され、この結果の子エンティティを取得し、他のndb操作も実行する可能性があります。
あまりにも多くの関数を記述しているため、前の各状況で呼び出される非同期タスクレット関数のみを記述するのが正しいですか??
結果の同期が必要な場合でも、 get_created_by_async_tasklet を呼び出してから、関数によって返される未来で get_results を呼び出します。
これを行うことで、パフォーマンスやエラーが発生しやすいなどの不都合はありますか? すべてのクエリ、get などに常に ndb 非同期タスクレットを使用する方がはるかに簡単であることがわかりました...必要な場合にのみその結果を呼び出すか、それ以外の場合はさらに非同期操作を実行してから get_results を呼び出します。
これがよく説明されていることを願っています...
前もって感謝します!