【问题标题】:Build a GQL with "IN' query for ReferenceProperty使用“IN”查询为 ReferenceProperty 构建 GQL
【发布时间】:2010-11-16 06:40:00
【问题描述】:

类消息(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)

messages = Message.gql('Where user In :users', users=users).fetch(100)

【问题讨论】:

    标签: google-app-engine gql


    【解决方案1】:

    如果没有完整的堆栈跟踪,很难判断(请?),但我猜 IN 不喜欢传递实体而不是键。试试这个:

    users = [userA.key(), userB.key(), userC.key()]
    messages = Message.gql("WHERE user in :users", users=users).fetch(100
    

    【讨论】:

      【解决方案2】:

      GQL 中的 IN 运算符实际上是由应用程序级 Python 代码合成为一个循环,执行一系列 = 获取并连接它们——它并不是底层存储功能的真正一部分,因此很遗憾受制于一些限制(而且它的性能从来都不是特别好)。我不确定将它包含在 Python API 中是否是一个很好的设计决定(我相信它在 Java API 中没有重复),但是,你就是这样。 (顺便说一句,!= 运算符也有类似的问题)。

      我不确定为什么这会特别干扰您的预期用途,但我怀疑这是由于“查询”对象是 datastore.MultiQuery 的实例而不是普通的 datastore.Query - 如果您这样做会发生什么在您自己的应用程序级 Python 代码中,GAE 提供的应用程序级 Python 代码通常会做什么?在您的 SDK 源文件 google/appengine/api/datastore.py 中查看,特别是 MultiQuery 类 - 最后归结为执行所有单独的查询并合并它们的结果(如果需要,按排序顺序,但这并不这里似乎不是这样)。

      【讨论】:

        【解决方案3】:

        使用此模型:

        class MyUsuario(db.Model):
            nombre=db.StringProperty(required=True)
        
        class Message(db.Model):
            MyUsuario = db.ReferenceProperty(MyUsuario, required=True, collection_name='Message_set')  
            text = db.StringProperty(required=True)
        

        此代码有效:

        from modelos import MyUsuario, Message
        from google.appengine.ext import db
        
        usuarios=MyUsuario.all()
        
        userA=usuarios[0]
        userB=usuarios[1]
        userC=usuarios[2]
        
        usuarios= []
        
        usuarios.append(userA.key())
        usuarios.append(userB.key())
        usuarios.append(userC.key())
        
        messages = db.GqlQuery('select * from Message Where MyUsuario In :usuari', usuari=usuarios)
        
        for message in messages:
            print message.text
        

        我看到了遮阳篷in this google groups post

        【讨论】:

          【解决方案4】:

          我认为您可能需要用户密钥列表?试试 users.append(userA.key())。用户引用属性的值是用户实体的键。

          【讨论】:

            猜你喜欢
            • 2011-08-17
            • 2010-10-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-05
            • 2011-09-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多