主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GoogleAppEngine, Python: リクエストハンドラごとにクエリを書くのを避ける

                
 GoogleAppEngineでDataStoreでデータを扱うためのAPIとして旧来のdbから新しいndbが開発されてしばらく経った。このndbのドキュメントを読んでいたらコードをきれいにまとめるための一つのヒントがあったので。

 Modelとして一冊の本を表すBookを書くことを考える。旧来のdbでの最初のサンプルや、GAEのGettingStartedにあたる部分でのサンプルを参考にするとModelが以下のように書ける。
class Book(ndb.Model):
title = ndb.StringProperty()
author = ndb.StringProperty()
isbn13 = ndb.StringProperty()
publishedDate = ndb.DateTimeProperty()
registeredDate = ndb.DateTimeProperty()


 上記のモデルに該当するデータが欲しい場合、クエリを掛ける。
query = Book.query()


 クエリには必要に応じて作家の名前を条件にしたフィルタや、タイトル、発刊日、登録日などを条件にした並べ替えなどが課される。あるパスにアクセスすると登録された本の一覧を返したくて、またあるパスにアクセスすると登録された本の中から作家名で絞った結果を返したかったり。
 条件に沿ったクエリをリクエストハンドラごとに書くのもいいけど、重複するようなものはどこかで一元管理できるとラクだしコードとしてシンプル。かといってそのために関数を増やすとしたら、うまく名前を与えてやらないとちょっとした混乱の元。そこでndbのドキュメントではモデルにクラスメソッドとしてそのクエリを付加している。
class Book(ndb.Model):
title = ndb.StringProperty()
author = ndb.StringProperty()
isbn13 = ndb.StringProperty()
publishedDate = ndb.DateTimeProperty()
registeredDate = ndb.DateTimeProperty()

@classmethod
def ordered_by_published_date(cls):
return cls.query().order(-cls.publishedDate)

@classmethod
def filtered_by_author(cls, author):
return cls.query().filter(cls.author == author)

 上記のようにクエリをリクエストハンドラごとに書くのでなくモデルとして定義したクラスに付随させることで管理が容易になる。たとえば今回のようにデータストアへのアクセスAPIがdbからndbへ変更があって書き換えたいときや、データストア自体を換装するときも書き換えが楽になるだろう。
            

コメントの投稿

非公開コメント

プロフィール

Matoba

Author:Matoba

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。