web-dev-qa-db-ja.com

TypeError: 'int'オブジェクトはインデックス作成をサポートしていません

私はこのクエリを持っています:

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(または変数に入れると決めたもの)を持つインジケーターを選択したいと思います。

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

これにより、some_idパラメータをリストに追加します。これはインデックス付け可能です。あなたの方法が私が思うように機能すると仮定すると、これは機能するはずです。

エラーが発生しているのは、そのメソッドのどこかで、おそらくその入力を反復処理しようとしている、または直接そのインデックスを作成しようとしているからです。おそらくこのように:some_id[0]

リスト(または反復可能)にすることで、そのような最初の要素にインデックスを付けることができます。

これを行うことで、タプルにすることもできます:(some_id,)これは不変であるという利点があります。

36
Stephan

クエリパラメータを execute() にTuple(反復可能で、厳密に言えば)、(some_id,) の代わりに some_id

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

あなたの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, ))
2
pmcnamee

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_への引数は反復を実装する必要があり、最も一般的にはListTuple、またはそれほど一般的ではありませんArray、またはカスタムイテレータの実装。

この特定のケースでは、古典的な文字列補間が_%s_、_%d_、_%b_文字列フォーマッタを埋めるときにエラーが発生します。

関連:

0
jmunsch