3

クラス メッセージ (db.Model):

user = db.ReferenceProperty(User, required=True, collection_name='Message_set')  
text = db.TextProperty(required=True)

これを試しましたが、gql ステートメントで BadValueError が発生しています。

ユーザー = []

users.append(userA)

users.append(userB)

users.append(userC)

メッセージ = Message.gql('Where user In :users', users=users).fetch(100)

4

4 に答える 4

2

GQLのIN演算子は、実際にはアプリケーションレベルのPythonコードによって、一連の=フェッチを実行してそれらを連結するループとして合成されます。これは、基盤となるストアの機能の一部ではないため、残念ながらいくつかの制限があります(パフォーマンスが特に低下することはありません)。良い)。Python APIに含めることが設計上の優れた決定であったかどうかはわかりませんが(Java APIでは複製されていないと思います)、あります。(ところで、!=オペレーターにも同様の問題があります)。

特にこれが意図した使用法に干渉する理由はわかりませんが、「query」オブジェクトがプレーンなdatastore.Queryではなくdatastore.MultiQueryのインスタンスであることが原因であると思われます。アプリケーションレベルのPythonコードGAEが提供するアプリケーションレベルのPythonコードは通常何をしますか?SDKソースファイルgoogle/appengine / api / datastore.py、具体的にはMultiQueryクラスを参照してください。最終的には、すべての個別のクエリを実行し、結果をマージします(必要に応じて、並べ替えられた順序で表示されますが、そうではありません。ここではそうであるようです)。

于 2009-08-03T05:16:49.530 に答える
2

完全なスタック トレースがないとわかりにくいですが (お願いしますか?)、IN はキーではなくエンティティが渡されることを好まないと思います。これを試して:

users = [userA.key(), userB.key(), userC.key()]
messages = Message.gql("WHERE user in :users", users=users).fetch(100
于 2009-08-03T12:30:12.057 に答える
0

ユーザーのキーのリストが必要になると思いますか? users.append(userA.key()) を試してください。ユーザー参照プロパティの値は、ユーザー エンティティのキ​​ーです。

于 2009-08-03T06:56:16.310 に答える