【问题标题】:Google App Engine: Trouble with Datastore QueryGoogle App Engine:数据存储区查询问题
【发布时间】:2010-03-02 16:01:48
【问题描述】:

此查询有效:

item = db.GqlQuery("SELECT * FROM Item WHERE CSIN = 13")[0]

虽然如果没有返回结果,它会在我的脸上炸毁。 (我怎样才能解决这个问题?当我想要最多一次迭代时,for 循环似乎很可疑。)

此查询不起作用:

item = db.GqlQuery("SELECT * FROM Item WHERE CSIN = :1", CSIN)[0]

CSIN 是一个代表数字的字符串。我收到此错误:

Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\__init__.py", line 507, in __call__
    handler.get(*groups)
  File "path\to\src\Main.py", line 42, in get
    item = db.GqlQuery("SELECT * FROM Item WHERE CSIN = :1", CSIN)[0]
  File "C:\Program Files\Google\google_appengine\google\appengine\ext\db\__init__.py", line 1717, in __getitem__
    raise IndexError('The query returned fewer than %d results' % (arg+1))
IndexError: The query returned fewer than 1 results

我在这里做错了什么?

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore


    【解决方案1】:

    您正试图从一个空的列表(或类似列表的对象)中获取一个项目。您正在做的事情类似于以下内容:

    >>> results = [] # an empty list
    >>> item = results[0] # Raises an IndexError, because there is nothing in the list
    

    你需要做的是:

    item = db.GqlQuery("SELECT * FROM Item WHERE CSIN = :1", CSIN).get()
    

    然后,item 将是 None 或查询的第一个结果。

    【讨论】:

      【解决方案2】:

      您的查询似乎返回了某种类型的数组或列表,它是空的。尝试访问其不存在的第一项会引发异常。

      在访问返回结果之前,尝试弄清楚返回结果的长度。

      【讨论】:

      • 如何计算它的长度?
      • 正如 Will 在另一个答案中指出的那样,您需要使用 get() 或 fetch(n) 从查询中实际获取结果。
      猜你喜欢
      • 2013-05-17
      • 2012-09-07
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2015-12-22
      • 1970-01-01
      • 2011-02-16
      相关资源
      最近更新 更多