Datastore API > Creating, Getting and Deleting Data にQuery と GqlQuery の2通りの例がありますが、今回は Query を利用してみます。
1. 単純動作テスト 検索条件の追加
content の値が 'Foo' のものだけ表示するようにしてみます。
greetings = Greeting.all().order('-date')これは素直に動作しました。
greetings.filter('content =', 'Foo') # 追加
2. Key とは ?
rowid にあたるような、ものがあります。
unique key that represents the object.
Doc だと APIs > Datastore API > Reference > Key です。
The key() method で得た値(Key object)を put() in the datastore したりすると NotSavedError エラーになるとあります。 RDBMS の場合の一意制約違反のエラーのようなものだと思います。
instance for a given Key using the get() function.
この部分は実際のデータをみてみないとこの先の機能の意味がつかめそうもありません。
key = greeting.key()なるほど、key がわかれば、 get(key) でたどって実際の値もわかるということです。
self.response.out.write('%s' % str(key) )
self.response.out.write('%s' % greeting.get(key) )
↓ このような値が返ってきていました。
agpoZWxsb3dvcmxkcg4LEghHcmVldGluZxgTDA
<__main__.Greeting object at 0x02600B30>
key の理解にはReferenceProperty model とういうのもポイントのようです。
あと、ancestor() methods on the object というのが、まだよく理解できていません。
さて、ようやくある程度、検索が動作すようになったと思っていたら、日本語からみのいやなエラーが発生しだしました。
body 内に日本語を使用する self.response.out.write("日本語") だけでエラーとなります。
INFO 2008-04-16 16:24:10,546 dev_appserver.py] "GET / HTTP/1.1" 500 -発生するようになったタイミングはこの部分の追加以降
Traceback (most recent call last):
File "C:\Python25\lib\wsgiref\handlers.py", line 92, in run
self.result = application(self.environ, self.start_response)
File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\__i
nit__.py", line 504, in __call__
response.wsgi_write(start_response)
File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\__i
nit__.py", line 223, in wsgi_write
body = self.out.getvalue()
File "C:\Python25\lib\StringIO.py", line 270, in getvalue
self.buf += ''.join(self.buflist)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 13: ordinal
not in range(128)
greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")困ったものです
for greeting in greetings:
if greeting.author:
self.response.out.write('wrote:' )
self.response.out.write('%s wrote:' % greeting.author.nickname())
else:
self.response.out.write('An anonymous person wrote:')
self.response.out.write('%s' %
cgi.escape(greeting.content))
self.response.headers['Content-Type'] = 'text/html'では効果なし。
self.response.headers['charset'] = 'UTF-8'
発生例はかなり報告されていますが・・・
いろいろ試してもうまくいきませんが、テンプレートを利用した場合はこうした日本語の問題は発生しないようですので、やはりテンプレート利用する方向になりそうです。