GAEのDatastoreではまった

2009/11/23 15075hit

GAE(GoogleAppEngine)のDatastoreでGQL使うときにはまったので
解決方法かいときます。

現象
DataStoreから取得したデータを表示しようとすると
A server error occurred. Please contact the administrator.
あるいは
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
のエラーが発生する。

解決方法
unicodeでエンコードする


経緯
HogeクラスをDataStoreから取得して画面に表示しようとしたのね


datas = db.GqlQuery("select * from Hoge")
for data in datas:
self.response.out.write(data.name)

んで、とりあえず条件式は外して全部持ってこようと思って
↑みたいなコードを書いたんだけど
A server error occurred. Please contact the administrator.
と怒られてしまった。
エラーメッセージ情報少な!

んで、1時間ほど考えて
よく考えたら、data.nameはstringProperty(Datastoreに保存する形)じゃないか、
画面に表示するなら文字列に変換しないと行けないのでは!

ということで

datas = db.GqlQuery("select * from Hoge")
for data in datas:
self.response.out.write(Str(data.name))

としたところ
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
というエラーに変わった。
やっと情報らしい情報が出てきたぞ、
どうやら変換元の値をasciiと思いこんで居るみたい。しかしDataStoreはUTF-8なのでそりゃエラーになるだろう。

datas = db.GqlQuery("select * from Hoge")
for data in datas:
self.response.out.write(Unicode(data.name,'utf-8'))

ってことで、utf-8にしてみたが
TypeError: decoding Unicode is not supported

なに!? なんでUnicodeがサポートされていない!? そんな馬鹿な

その後また1時間ほど悩んで
よく考えてみたらデコードじゃなくてエンコードだよなと

datas = db.GqlQuery("select * from Hoge")
for data in datas:
self.response.out.write(data.name.encode('utf-8'))

んでやっと動いたよー
いやぁ、難しかった
Pythonは日本語と相性が悪いって聞いていたけど身をもって痛感したよ。
はなからJAVAで作るべきだったか? いまさら戻れないけど
ということで、これでのこりはあとわずか

前:クラウドコンピューティングはやめ、ネットサーバーと呼びたい 次:Google AppEngineのdev_appserver高速化

関連キーワード

[Python][IT]

コメント

名前:kensei|投稿日:2009/11/25 22:45

Python、、以前オレも勉強したよ〜
TracがPython製なんよね。
最近はスクリプト言語をJVM上で動かすのに興味があります。

名前:kenz|投稿日:2009/11/26 23:58

JythonとかJRubyとか?
俺は最近GOが気になるよ 言語としてよりもあのゆるキャラに

コメントを投稿する