web-dev-qa-db-fra.com

TypeError: l'objet 'int' ne supporte pas l'indexation

J'ai cette requête:

some_id = 1

cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', some_id)

Je reçois l'erreur suivante: 

TypeError: 'int' object does not support indexing

some_id est un int, mais j'aimerais sélectionner les indicateurs qui ont some_id = 1 (ou peu importe # que j'ai décidé de mettre dans la variable).

32
nlr25
cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', [some_id])

Cela transforme le paramètre some_id en une liste indexable. En supposant que votre méthode fonctionne comme je le pense, cela devrait fonctionner.

L'erreur se produit parce que quelque part dans cette méthode, il essaie probablement de parcourir cette entrée ou d'y indexer directement. Peut-être comme ceci: some_id[0]

En lui faisant une liste (ou itérable), vous lui permettez d’indexer dans le premier élément comme ça.

Vous pouvez aussi en faire un tuple en faisant ceci: (some_id,) qui a l'avantage d'être immuable.

32
Stephan

Vous devez transmettre les paramètres de requête à execute() sous forme de tuple (un itérable à proprement parler), (some_id,) au lieu de some_id:

cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', (some_id,))
25
alecxe

Votre identifiant doit être une sorte de variable pour que Mogrify comprenne l’entrée, voici la citation pertinente de la documentation foire aux questions :

>>> cur.execute("INSERT INTO foo VALUES (%s)", "bar")    # WRONG
>>> cur.execute("INSERT INTO foo VALUES (%s)", ("bar"))  # WRONG
>>> cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct
>>> cur.execute("INSERT INTO foo VALUES (%s)", ["bar"])  # correct

Cela devrait fonctionner:

some_id = 1

cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', (some_id, ))
2
pmcnamee

Erreur légèrement similaire lors de l'utilisation de Django:

TypeError: 'RelatedManager' object does not support indexing

Ça ne marche pas

mystery_obj[0].id

Cela marche:

mystery_obj.all()[0].id

Fondamentalement, l'erreur lit Some type xyz doesn't have an __ iter __ or __next__ or next function, so it's not next(), or itsnot[indexable], or iter(itsnot); dans ce cas, les arguments de cursor.execute devraient implémenter l'itération, le plus souvent une List, Tuple, ou moins couramment une Array, ou une implémentation personnalisée d'itérateur.

Dans ce cas spécifique, l'erreur se produit lorsque l'interpolation de chaîne classique va remplir les formateurs de chaîne %s, %d, %b

En relation:

0
jmunsch