2010-03-02 8 views
3

Cette requête fonctionne:Google App Engine: Trouble with Datastore requêtes

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

bien que s'il n'y a pas de résultats renvoyés, il souffle dans mon visage. (? Comment puis-je contourner cette Une boucle for semble douteuse quand je veux au maximum une itération.)

Cette requête ne fonctionne pas:

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

CSIN est une chaîne représentant un nombre. Je reçois cette erreur:

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 

Qu'est-ce que je fais mal ici?

Répondre

9

Vous essayez d'obtenir un élément d'une liste (ou d'un objet semblable à une liste) vide. Ce que vous faites est un peu comparable à ce qui suit:

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

Ce que vous devez faire à la place:

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

Ensuite, item sera soit None ou le premier résultat de la requête.

+0

+1 Simple et agréable. –

0

Il semble que votre requête retourne un tableau ou une liste de quelque sorte, qui est vide. Essayer d'accéder à son premier élément inexistant entraîne une exception.

Essayez de déterminer la longueur du résultat retourné avant d'y accéder.

+0

Comment puis-je déterminer sa longueur? –

+0

Comme le fait remarquer Will dans l'autre réponse, vous devez utiliser get() ou fetch (n) pour obtenir les résultats de la requête. –