在Google App Engine中使用GQL进行参数绑定

3 投票
1 回答
2113 浏览
提问于 2025-04-15 13:54

好的,我有一个模式:

class Posts(db.Model):
  rand1 = db.FloatProperty()
  #other models here

还有这个控制器:

class Random(webapp.RequestHandler):
  def get(self):    
      rand2 = random.random()
      posts_query = db.GqlQuery("SELECT * FROM Posts WHERE rand1 > :rand2 ORDER BY rand LIMIT 1")
      #Assigning values for Django templating
      template_values = {
          'posts_query': posts_query,
           #test purposes
          'rand2': rand2,
          }

      path = os.path.join(os.path.dirname(__file__), 'templates/random.html')
      self.response.out.write(template.render(path, template_values))

当添加一个实体时,会生成一个随机的小数(范围是0到1),然后当我需要随机获取一个实体时,我想用一个简单的SELECT查询来实现。但是它出错了,错误信息是:

BadArgumentError('Missing named arguments for bind, requires argument rand2',)

现在,如果我这样做:

posts_query = db.GqlQuery("SELECT * FROM Posts WHERE rand1 > 1 ORDER BY rand LIMIT 1")

那么它就能正常工作;所以很明显我的查询有问题。那么在where语句中怎么使用变量呢 :S

1 个回答

3

替换为:

 "...WHERE rand1 > :rand2 ORDER BY rand LIMIT 1")

用:

  "...WHERE rand1 > :rand2 ORDER BY rand LIMIT 1", rand2=rand2)

或者

  "...WHERE rand1 > :1 ORDER BY rand LIMIT 1", rand2)

想了解更多信息,可以查看:“Gql查询类

有趣的是,我大约在两个小时前才学到这个 :P

撰写回答