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 (или любой другой, который я решил бы добавить в переменную).

8 ответов

Решение
cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', [some_id])

Это превращает some_id параметр в список, который индексируется. Предполагая, что ваш метод работает так, как я думаю, он должен работать.

Ошибка возникает из-за того, что где-то в этом методе он, вероятно, пытается выполнить итерации по этому вводу или индексировать непосредственно в него. Возможно так: some_id[0]

Делая его списком (или итеративным), вы позволяете ему индексировать первый элемент подобным образом.

Вы также можете превратить его в кортеж, выполнив это: (some_id,) который имеет преимущество быть неизменным.

Вы должны передать параметры запроса execute() как кортеж (итеративно, строго говоря), (some_id,) вместо some_id:

cursor.execute('
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" =   %s;', (some_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, ))

Приведение типовsome_idдля строки также работает.

      cursor.execute(""" SELECT * FROM posts WHERE id = %s """, (str(id), ))

У меня была такая же проблема, и она работала, когда я использовал обычное форматирование.

      cursor.execute(f'
    SELECT "Indicator"."indicator" 
    FROM "Indicator" 
    WHERE "Indicator"."some_id" ={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 форматеры строк.

Связанные с:

Передать параметр в список, который можно индексировать.

      cur.execute("select * from tableA where id =%s",[parameter])

Укажите аргумент vars=, который может работать:

      cursor.execute("
          SELECT "Indicator"."indicator" 
          FROM "Indicator" 
          WHERE "Indicator"."some_id" = %s', vars=[id] )
Другие вопросы по тегам