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).
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.
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,))
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, ))
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: