2008-07-27

GQLでReference型の列でIN条件を利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
GQLでReference型の列に対してINを利用するのにちょっと悩んでしまったので、メモです。
以下のようなモデルがある時の場合です。

class AAA(db.Model):
name = db.StringProperty(required=True)

class BBB(db.Model):
memo = db.StringProperty(required=True)
ref = db.ReferenceProperty(AAA)

AAAからデータを一回引っこ抜いて、そこでBBB用検索用のIN条件を作成する場合ですが、以下のようにする必要があります。

aaa = db.GqlQuery("SELECT * FROM AAA")
search_list = []
for aa in aaa:
search_list.append(aa.key())
bbb = db.GqlQuery("SELECT * FROM BBB WHERE ref IN :list",list = search_list)

search_list.append(aaa.key())
の部分を
search_list.append(aaa)
としていたら、以下のようなエラーが出てしまったのです。

Traceback (most recent call last):
....
File "C:\...\google\appengine\ext\db\__init__.py", line 1257, in __iter__
return self.run()
File "C:\...\google\appengine\ext\db\__init__.py", line 1589, in run
query_run = self._proto_query.Run(*self._args, **self._kwds)
File "C:\...\google\appengine\ext\gql\__init__.py", line 563, in Run
bind_results = self.Bind(args, keyword_args)
File "C:\...\google\appengine\ext\gql\__init__.py", line 254, in Bind
query.update(enumerated_query)
File "C:\...\google\appengine\api\datastore.py", line 1035, in update
self.__setitem__(filter, value)
File "C:\...\google\appengine\api\datastore.py", line 978, in __setitem__
datastore_types.ToPropertyPb(' ', value)
File "C:\...\google\appengine\api\datastore_types.py", line 958, in ToPropertyPb
'Unsupported type for property %s: %s' % (name, proptype))
BadValueError: Unsupported type for property :


あと、Google App Engineのバグなのかどうかわかりませんが、GQLでINを使ったクエリーの結果に対して、count()を利用するとエラーが出るようです。
これは、ReferencePropertyと関係なくでるようです。StringPropertyでも出ることを確認しました。
ちなみに以下のようなエラーメッセージが出ます。

Traceback (most recent call last):
File "C:\...\google\appengine\ext\webapp\__init__.py", line 499, in __call__
handler.get(*groups)
File "C:\...\myapp.py", line X, in get
xxx = items.count()
File "C:\...\google\appengine\ext\db\__init__.py", line 1286, in count
return self._get_query().Count(limit=limit)
File "C:\...\google\appengine\api\datastore.py", line 957, in Count
self._ToPb(limit=limit), resp)
File "C:\...\google\appengine\api\datastore.py", line 1110, in _ToPb
pb.set_kind(self.__kind.encode('utf-8'))
AttributeError: 'NoneType' object has no attribute 'encode'

最初、ずっとcountしていて何をしてもエラーが出るから原因がなかなかつかめませんでした。

2 件のコメント:

イクラン さんのコメント...

古い話題かもしれませんが。。。
同じ現象で困っていたんですが、どうも開発サーバだけの問題で実環境だとうまくいきました。参考まで。

イクラン さんのコメント...

今投稿した内容はIN使ってcount()した時の場合です。他のは試してないです。