私はこのクエリを持っています:
some_id = 1
cursor.execute('
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s;', some_id)
次のエラーが表示されます。
TypeError: 'int' object does not support indexing
some_idはintですが、some_id = 1(または変数に入れると決めたもの)を持つインジケーターを選択したいと思います。
cursor.execute('
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s;', [some_id])
これにより、some_id
パラメータをリストに追加します。これはインデックス付け可能です。あなたの方法が私が思うように機能すると仮定すると、これは機能するはずです。
エラーが発生しているのは、そのメソッドのどこかで、おそらくその入力を反復処理しようとしている、または直接そのインデックスを作成しようとしているからです。おそらくこのように:some_id[0]
リスト(または反復可能)にすることで、そのような最初の要素にインデックスを付けることができます。
これを行うことで、タプルにすることもできます:(some_id,)
これは不変であるという利点があります。
クエリパラメータを execute()
にTuple(反復可能で、厳密に言えば)、(some_id,)
の代わりに some_id
:
cursor.execute('
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s;', (some_id,))
あなたのIDは、mogrifyが入力を理解するために何らかの反復可能である必要があります。ここに関連する引用があります よくある質問のドキュメント :
>>> 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
これは動作するはずです:
some_id = 1
cursor.execute('
SELECT "Indicator"."indicator"
FROM "Indicator"
WHERE "Indicator"."some_id" = %s;', (some_id, ))
Djangoを使用した場合のわずかに類似したエラー:
_TypeError: 'RelatedManager' object does not support indexing
_
これは機能しません
_mystery_obj[0].id
_
これは動作します:
_mystery_obj.all()[0].id
_
基本的に、エラーはSome type xyz doesn't have an __ iter __ or __next__ or next function, so it's not next(), or itsnot[indexable], or iter(itsnot)
を読み取ります。この場合、_cursor.execute
_への引数は反復を実装する必要があり、最も一般的にはList
、Tuple
、またはそれほど一般的ではありませんArray
、またはカスタムイテレータの実装。
この特定のケースでは、古典的な文字列補間が_%s
_、_%d
_、_%b
_文字列フォーマッタを埋めるときにエラーが発生します。
関連: