Google App Engine であそんでみよう. (6)

GQL

Datastore へのアクセスには, 通常Queryオブジェクトを使うのだが, RDB用のSQLになれきってしまった人のために, SQLに一見似た問い合わせ言語が用意されている. それがGQL. こんな感じで使える.

q = GqlQuery("SELECT * FROM Memo WHERE author = :1", user)
for memo in q:
  ...

「:1」は, 一つ目の引数と置換する, という意味. キーワードを用いて

q = GqlQuery("SELECT * FROM Memo WHERE author = :author", author=user)

と書くこともできる.

これは

q = db.Query(Memo).filter("author =", user)

と書くのと同じ.

GQLで書くと一見SQLとそっくりになるが, 実は全然違う.

  • SELECT の後に本来はプロパティが書けるはずなのだが, GQL では * しか書けない! 全然 SELECT して無いじゃん!
  • WHERE の後の条件式に AND条件は書けるが OR 条件は書けない
  • 条件式に SQL の IN, BETWEEN, LIKE などの演算子は使えない
  • っていうか, そもそもSELECTしかない

要するに, GQLで書いてもQueryオブジェクトを作っても表現力は同じだということだ. 当たり前だが.
それならGQLのような中途半端なものは使わずに, Queryオブジェクトを使った方がなんぼかいいような気がするが...