Twitterもどきを作りながらGoogle App Engineの肝データストアを理解する

白石俊平(あゆた)
2008-04-14 17:00:00
  • このエントリーをはてなブックマークに追加

データの問い合わせ

 エンティティのput()メソッドを呼び出せば、データの保存を行えることはわかった。では、データの検索はどのようにして行うのだろうか?

GqlQueryを用いた問い合わせ

 App Engineでは、SQLに似たシンタックスを持つ、GQLと呼ばれる問い合わせ言語を用いてデータの検索を行うことができる。検索結果は、エンティティ(もしくはそのリスト)の形で返される。

 サンプルで、メッセージの検索を行っている部分のソースコードを抜き出してみてみよう。ログインしたユーザのメッセージのみを抽出して取り出す部分のソースだ。

# GQLを用いた問い合わせ
messages = db.GqlQuery("SELECT * FROM Message"
           " WHERE author = :1"
           " ORDER BY date DESC LIMIT 20", user)

 まず、google.appengine.ext.db.GqlQuery()クラスのインスタンスをコンストラクタの第一引数が、GQLを表す文字列だ。ほとんどSQLと変わらないのがお分かりだろう。

 GQLは、本質的にリレーショナルとは異なるデータ構造であるデータストアに対して、SQLに「似た」問い合わせを行うことができると言うだけで、SQLと完全に等価なわけではない。GQLの特徴をいくつか挙げておこう。

  • WHERE句に示す条件式の値に、リテラルを指定することができない。そのため、この例のように「:1」と言う位置パラメータを指定しておき、コンストラクタの第二引数以降でパラメータを置換するという方法をとる。
    ※もしくは、以下のように名前付きパラメータを使用することもできる。
    messages = db.GqlQuery("SELECT * FROM Message"
               " WHERE author = :author"
               " ORDER BY date DESC LIMIT 20", author=user)
  • SELECTの後には「*」以外を指定することはできない。SQLのように、「選択列をしぼって取得」などということはできないわけだ。
  • FROMキーワードの後に来るのはモデルオブジェクトの種別(クラス名)であり、SQLでは通常カラム名を指定する部分にはモデルのプロパティ名を指定する。
  • GQLのキーワードは大文字、小文字を区別しないが、モデルオブジェクトのクラス名やプロパティ名ではその区別がある
  • 「イコールではない」ことを表す演算子(!=、<>など)は、現状提供されていない。将来的にはサポートされるとのこと。
  • イコール以外の条件式(<、>、<=、>=など)は、一種類のプロパティに対してのみ利用できる。例えば、「date >= :1 AND date <= :2」などは可能だが、「date >= :1 AND count >= :2」の用なことはできない。
  • イコール以外の条件式とORDER BYを同時に使用するときには、条件式のプロパティがORDER BYの最初に指定される必要がある。「WHERE date >= :1 ORDER BY date」は正しいが、「WHERE date >= :1 ORDER BY count」はエラーとなる。

 このように、GQLには標準SQLと比べると多くの制限がある。だが、これらの制限は「Googleレベルのスケーラビリティ」を得るためのトレードオフだと考えれば安いものではないか。

 ただし、これらの制限は非常に引っかかり易い(実際、筆者はここで挙げたものすべてに一旦引っかかってしまった)ので、確実に頭に入れておく必要がある。こうした制限を回避するため、モデルの設計を変更しなければならない場合も生じることだろう。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]